我正在构建一个应用程序原型,持久存储在“服务器”机器(同一个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中的错误吗?
答案 0 :(得分:0)
SQLite不允许数据库文件具有多个写锁。对于任何更改数据的事务,或者应用程序明确请求一个事务,都会采用写锁定。
显然,Core Data连接保持写入事务或写入锁定打开。
答案 1 :(得分:0)
据我所知,Core数据将使用独占锁定模式进行保存。我建议你将参数“-com.apple.CoreData.SQLDebug 1”传递给你的应用程序。如果您在控制台中找到“BEGIN EXCLUSIVE”,我猜您的设置会被Core Data忽略。