【问题标题】:Setting Core Data persistent store (SQLite) as NORMAL locking-mode将 Core Data 持久存储 (SQLite) 设置为 NORMAL 锁定模式
【发布时间】:2012-09-10 13:14:03
【问题描述】:

我正在构建一个应用程序原型,其中持久存储通过 AFP 在“服务器”机器(同一个 LAN)上使用 SQLite。 但是,我无法从我的应用的 2 个不同实例连接到商店。

我在持久存储协调器上设置 SQLite pragma 设置(与锁定相关),如下所示:

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

NSMutableDictionary *pragmaOptions = [NSMutableDictionary dictionary];
[pragmaOptions setObject:@"NORMAL" forKey:@"locking_mode"];
NSDictionary *storeOptions = [NSDictionary dictionaryWithObject:pragmaOptions forKey:NSSQLitePragmasOption];

if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:storeOptions error:&error]) {
    [[NSApplication sharedApplication] presentError:error];
    return nil;
}

我在尝试从第二个客户端连接到商店时收到的错误消息(即当第一个客户端已经成功连接时)是:

错误:sqlite 数据库已被锁定,因为它正在被另一台主机使用,该主机在 .../TestDBApp.storedata 上持有主机独占锁;此主机 UID... 无法覆盖主机独占锁,直到另一个主机 UID... 释放其对 .../.TestDBApp.storedata-conch 的锁

我做错了吗?

是否可以使用 Core Data 和 SQLite 从 2 个客户端访问同一个存储?

这是 Core Data 和/或 SQLite API 中的错误吗?

【问题讨论】:

  • 你有没有找到从 2 个不同进程访问 sqlite 的方法?如果一个连接有独占锁,我猜第二个连接不会等到它被提交,你必须实现你的重试逻辑。

标签: core-data sqlite nspersistentstore


【解决方案1】:

SQLite 不允许一个数据库文件有多个写锁。任何更改数据的事务或应用程序显式请求的事务都会使用写锁。

显然,Core Data 连接持有一个写事务或一个写锁打开。

【讨论】:

    【解决方案2】:

    据我所知,Core data 将使用独占锁模式进行保存。我建议您将参数“-com.apple.CoreData.SQLDebug 1”传递给您的应用程序。如果您在控制台中找到“BEGIN EXCLUSIVE”,我猜您的设置会被 Core Data 忽略。

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2019-01-30
      • 1970-01-01
      • 2013-09-23
      • 2011-01-15
      相关资源
      最近更新 更多