iphone - iOS中的sqlite锁定问题

标签 iphone sql objective-c sqlite

我的 Sqlite 数据库是从我的代码中的各个线程访问的,因此我遇到了很多数据库锁定问题。

为了克服锁定问题,我只在主线程中查询数据库。这样做的缺点是如果有很多查询要执行,我的主线程很忙。

我想编写一种机制,其中所有数据库调用都从一个地方(在辅助线程中)执行,以便它可以同步并且调用者可以从任何线程调用。

如果任何模块想要执行查询,它可能会从主 DB Sync 类检查 DB 是忙还是空闲来执行任务。

备注 :- 在我当前的实现中,每次我想执行查询时我都会打开和关闭数据库。它会对性能产生任何影响吗?

任何正确方向的提示将不胜感激。

最佳答案

重新打开数据库当然比保持打开需要更多的时间。但是,这可能不是一个明显的时间量。

我建议你创建一个 Grand Central Dispatch queue并将其用于所有数据库访问。以下是创建它的方法:

// The queue needs to be a global variable, or globally accessible in some way.
dispatch_queue_t dbQueue;
// Make your sqlite3 connection global too.
sqlite3 *dbConnection;

// In your application delegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // usual initialization ...
    ...
    int rc = sqlite3_open(dbFilename, &dbConnection);
    if (rc != SQLITE_OK)
        handleDbError(rc, dbConnection);
    dbQueue = dispatch_queue_create("dbQueue", DISPATCH_QUEUE_SERIAL);
    ...
}

以下是你如何使用它:
dispatch_queue_async(dbQueue, ^{
    // This block runs off the main thread, and does not run simultaneously
    // with any other blocks submitted to `dbQueue`.
    NSString *result = executeDatabaseQuery();

    dispatch_queue_async(dispatch_get_main_queue(), ^{
        // This block runs on the main thread.
        [(MyAppDelegate *)[UIApplication delegate] presentResult:result];
    });
});

关于iphone - iOS中的sqlite锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8163267/

相关文章:

iPhone:NSUserDefaults 存储在哪里?

sql - 如何使用 SQL Server 从当前日期减去 30 天

objective-c - MASPreferences 选择 View

Java垃圾收集器

objective-c - 将 iOS 版本添加到 Mac 应用程序

iphone - 构建自己的 "SDK"放入其他第三个应用程序

iphone - 使用SocializeActionBar添加多个实体

sql - 日期和季度 SQL ORACLE

iphone - Cocoa错误260,文件路径结构

sql - 使用 SQL 计算列中的项目数