1

我正在构建一个应用程序原型,其中持久存储通过 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 中的错误吗?

4

2 回答 2

0

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

于 2012-10-20T14:14:22.990 回答
0

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

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

于 2012-09-18T11:17:19.660 回答