ios - 使用 FMDB 在后台线程上执行数据库操作
ios - perform database actions on background thread with FMDB
我正在 iOS (obj-c) 项目中使用本地 SQLITE 数据库,我们选择使用 FMDB。请注意,我对更改为 Core Data 或从 FMDB 切换到其他库不感兴趣。
一切正常,但是当我们第一次运行应用程序时,数据从我们的服务器下载,json 被解析,然后分类到本地数据库中。由于传入的信息量很大,这需要 30 到 40 秒的时间。理想情况下,这将在后台完成,但 FMDB 不允许这样做(至少据我所知),因为它可能会导致数据库数据完整性问题。
有没有人成功使用 FMDB 库在后台线程上运行所有查询、插入等?我试过简单地将动作包装在:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// ... query/insert/update/delete
});
...但我最终遇到了数据库完整性问题。任何提示或示例都会很棒。提前致谢。
@nawar - 抱歉没有早点发布。我最终在 dispatch_async 块中使用了 FMDatabaseQueue 的单个实例(而不是 FMDatabase)。奇迹般有效。我 运行 遇到的问题是由于使用 FMDatabase。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
BOOL result = YES;
for (int i = 500; i < 1000; i++) {
result = [db executeUpdate:@"insert into testTable (name) values(?)",[NSString stringWithFormat:@"name-%d",i]];
if (!result) {
NSLog(@"break");
*rollback = YES;
break;
}
}
}];
});
我正在 iOS (obj-c) 项目中使用本地 SQLITE 数据库,我们选择使用 FMDB。请注意,我对更改为 Core Data 或从 FMDB 切换到其他库不感兴趣。
一切正常,但是当我们第一次运行应用程序时,数据从我们的服务器下载,json 被解析,然后分类到本地数据库中。由于传入的信息量很大,这需要 30 到 40 秒的时间。理想情况下,这将在后台完成,但 FMDB 不允许这样做(至少据我所知),因为它可能会导致数据库数据完整性问题。
有没有人成功使用 FMDB 库在后台线程上运行所有查询、插入等?我试过简单地将动作包装在:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// ... query/insert/update/delete
});
...但我最终遇到了数据库完整性问题。任何提示或示例都会很棒。提前致谢。
@nawar - 抱歉没有早点发布。我最终在 dispatch_async 块中使用了 FMDatabaseQueue 的单个实例(而不是 FMDatabase)。奇迹般有效。我 运行 遇到的问题是由于使用 FMDatabase。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
BOOL result = YES;
for (int i = 500; i < 1000; i++) {
result = [db executeUpdate:@"insert into testTable (name) values(?)",[NSString stringWithFormat:@"name-%d",i]];
if (!result) {
NSLog(@"break");
*rollback = YES;
break;
}
}
}];
});