2014-04-03 7 views
1

FMDB에서 SQLite 데이터를 관리합니다.FMDB : 데이터를 미리 입력하십시오.

이 응용 프로그램에서는 데이터를 미리 넣으므로 sample.dbterminalLita으로 미리 작성하고 복사 한 다음 프로젝트로 가져 왔습니다.

문제는 데이터베이스를 업데이트 할 수 없다는 것입니다.
saveData이라고해도 title 열은 비어 있습니다.
데이터베이스를 업데이트하려면 어떻게 수정해야합니까?

· sample.db에는 events 테이블이 있습니다.
테이블 events 스키마는 (id INTEGER PRIMARY KEY AUTOINCREMENT, day TEXT, title TEXT, time INTEGER);
입니다. Eventevents 테이블에 추가합니다.

이제 saveData 메서드를 호출하고 "test"events에 입력합니다.

Event.h

@interface Event : NSObject 

@property (nonatomic, assign) NSInteger eventId; 
@property (nonatomic, copy) NSString* day; 
@property (nonatomic, copy) NSString* title; 
@property (nonatomic, assign) NSInteger time; 

DetailViewController.m

- (void)saveData:(id)sender 
{ 
    Event* newEvent = [[Event alloc]init]; 
    newEvent.title = @“test"; 

    [self.delegate editEventDidFinish:self.event newEvent:newEvent]; 

@end 

MasterViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.daoEvents = [[DaoEvents alloc] init]; 
} 

- (void)editEventDidFinish:(Event *)oldEvent newEvent:(Event *)newEvent 
{ 
    [self.daoEvents update:newEvent];    
    [self.navigationController popViewControllerAnimated:YES]; 
} 

- (void)removeOldEnent:(Event*)oldEvent 
{ 
    [self.daoEvents remove:oldEvent.eventId]; 
} 

DaoEvents.m

#define DB_FILE_NAME @“sample.db" 
    #define SQL_UPDATE @"UPDATE events SET day = ?, title = ?, time = ? WHERE id = ?;” 
    #define SQL_DELETE @"DELETE FROM events WHERE id = ?;" 

    - (FMDatabase *)dbConnect 
    { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString* dir = [paths objectAtIndex:0]; 

     return [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:DB_FILE_NAME]]; 
    } 

    - (BOOL)update:(Event *)event 
    { 
     FMDatabase* db = [self dbConnect]; 
     [db open]; 

     BOOL success = [db executeUpdate:SQL_UPDATE, event.day, event.title, [NSNumber numberWithInt:event.time],[NSNumber numberWithInteger:event.eventId]]; 

     [db close]; 

     NSLog(@"%@", event.title); //correctly outputs “test" 

     return success; 
    } 

    - (BOOL)remove:(NSInteger)eventId 
    { 
     FMDatabase* db = [self dbConnect]; 
     [db open]; 

     BOOL isSucceeded = [db executeUpdate:SQL_DELETE, [NSNumber numberWithInteger:eventId]]; 

     [db close]; 

     return isSucceeded; 
    } 

데이터베이스를 업데이트하려면 어떻게 수정해야합니까?
감사합니다.

+0

업데이트를 시도하기 전에 바로 레코드를 삭제하려고합니다. 삭제 된 레코드가 업데이트하려는 'id'가있는 레코드입니까? 그렇다면 실제로 업데이트하려는 경우 'DELETE'를 제거하십시오. 새로운 레코드를 지우고 추가하려고한다면,'UPDATE'가 아닌'INSERT'를하십시오. – Rob

답변

0

UPDATE 값이 id 인 레코드가 없으므로 문장이 업데이트되지 않는 것 같습니다. 업데이트 된 행의 수를 알려주는 FMDB changes 메서드 (sqlite3_changes())에 의해 반환 된 값을 검사하면 0이 반환 될 것이라고 내기합니다. UPDATEWHERE 절을 사용하면 일치하는 항목을 찾지 못해도 오류가 발생하지 않고 데이터를 변경하지 않고 조용히 성공합니다. changes 메서드는 레코드가 실제로 업데이트되었는지 확인하는 데 사용할 수 있습니다.

먼저 id 값이 있는지 확인하고 UPDATE을 찾거나 그렇지 않은 경우 INSERT을 수행 할 수 있습니다. 또는 동일한 id 값이없는 값을 알고있는 경우 INSERT을 직접 수행 할 수 있습니다.