将Core Data持久存储(SQLite)设置为NORMAL锁定模式

时间:2012-09-18 09:32:27

标签: core-data sqlite nspersistentstore

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

我在持久性商店协调员上设置了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 个答案:

答案 0 :(得分:0)

SQLite不允许数据库文件具有多个写锁。对于任何更改数据的事务,或者应用程序明确请求一个事务,都会采用写锁定。

显然,Core Data连接保持写入事务或写入锁定打开。

答案 1 :(得分:0)

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