FMDB:提前放数据

Posted

技术标签:

【中文标题】FMDB:提前放数据【英文标题】:FMDB: put the data in advance 【发布时间】:2014-04-03 17:41:24 【问题描述】:

我通过 FMDB 管理 SQLite 数据。

在这个App中,我想提前放数据,所以我把terminalterminalLita提前做了dbfilesample.db,复制过来导入到项目中。 问题是您无法更新数据库。 即使称为saveData,列title 也是空的。 我需要如何修复才能更新数据库?

・在sample.db,有一个表events。 ・表events架构是(id INTEGER PRIMARY KEY AUTOINCREMENT, day TEXT, title TEXT, time INTEGER); ・您将数据Event 添加到表events。 现在,您调用方法saveData 并将"test" 放入events

事件.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;
    

我需要如何修复才能更新数据库? 谢谢。

【问题讨论】:

您在尝试更新之前正在删除一条记录。删除的记录是您要更新的带有id 的记录吗?如果是这样,如果您真的打算更新它,请删除DELETE。如果您打算删除并添加新记录,请使用INSERT 而不是UPDATE 【参考方案1】:

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

您可以先检查是否存在具有该id 值的值,如果找到则执行UPDATE,否则执行INSERT。或者,如果你知道不会有相同的id 值,你可以直接做INSERT

【讨论】:

以上是关于FMDB:提前放数据的主要内容,如果未能解决你的问题,请参考以下文章

FMDB 二次封装工具类,让你快速学会封装,集成数据库

如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程

Cocoapods、Swift 和 FMDB Cipher - 这三个目前兼容吗?

FMDB 数据库的使用

错误 fmdb 设置 label.text

使用多线程读取 FMDB 数据库