FMDB:提前提交数据

时间:2014-04-03 17:41:25

标签: ios xcode sqlite fmdb

我通过FMDB管理SQLite数据。

在这个应用程序中,我想提前放入数据,所以我提前sample.dbterminal创建了dbfile Lita,将其复制并导入到项目中。

问题是你无法更新数据库 即使调用saveData,列title也是空的 我如何修复以更新数据库?

·在sample.db中,有一个表格events ·表events架构为(id INTEGER PRIMARY KEY AUTOINCREMENT, day TEXT, title TEXT, time INTEGER);
·您将数据Event添加到表events

现在,您调用方法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;
    }

如何修复更新数据库? 谢谢。

1 个答案:

答案 0 :(得分:0)

您的UPDATE语句可能没有更新任何内容,因为没有id值的记录。如果你检查FMDB changes方法(sqlite3_changes())返回的值,它告诉你有多少行被更新,我下注它将返回零。当您执行UPDATE并且WHERE子句找不到任何匹配项时,它不会导致错误,而是会在不更改任何数据的情况下悄然成功。 changes方法可用于确认记录是否真正更新。

您可以先检查,看看是否有值为id的值,如果找到则执行UPDATE,否则执行INSERT。或者,如果您知道没有相同id值的值,则可以直接执行INSERT