2015-05-01 83 views
4

我正在考虑使用两个persistent store coordinatorPSC1只读一个SQLite DBPSC2读写DB。有时PSC1DB重新加载内容两个NSPersistentStoreCoordinator可以使用相同的数据库吗?

你认为这是可能的吗?

您是否认为两个PSC可以以原子方式读取/写入数据库,而不会导致任何损坏?

PSC是否对数据库设置了锁定,以便从其他PSC进行访问?

+0

没有尝试过,但我认为它可以使用NSReadOnlyPersistentStoreOption。结帐https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/index.html#//apple_ref/doc/constant_group/Store_Options – JakubKnejzlik

+0

您可能会对[此方法]感兴趣, (http://martiancraft.com/blog/2015/03/core-data-stack/),它使用2个'NSManagedObjectContext's。 – johnpatrickmorgan

+0

您可能想要展开为什么要这样做。你想要的最后一件事是不必要地过度优化你的核心数据栈。我很想看看你目前看到了什么样的表现,以及为什么你认为你需要协调员来提高这一点。 –

回答

5

您可以有两个不同的NSPersistentStoreCoordinator实例访问相同的文件。事实上,多年前这是一个推荐的方法。

但是,这样做有问题。如果一个NSPersistentStoreCoordinator发生了写入文件系统的更改,另一个NSPersistentStoreCoordinator实例将不知道它。 NSPersistentStoreCoordinatorNSManagedObjectContext维护它们管理的对象的内存状态。使用两个NSPersistentStoreCoordinator实例会导致它们在某个时刻不同步。例如,如果NSPersistentStoreCoordinator A从NSPersistentStore中的记录加载对象,则会有该对象的内存版本。如果NSPersistentStoreCoordinator B然后删除由相同记录支持的对象,则A的对象版本没有记录。当Core Data试图在A中对该对象进行故障时,您将得到一个异常。

您是否认为两个PSC可以以原子方式读取/写入DB,而不会导致任何损坏?

损坏对于NSSQLiteStoreType商店来说很少出现问题。与其他商店,这当然是可能的。

PSC是否对数据库设置了锁定,以便从其他PSC进行访问?

内置的NSPersistentStore具体类我们在访问文件系统的记录(但不总是用于元数据)时协调文件。所以是的,有一个锁涉及到,它应该防止两个NSPersistentStore实例同时修改相同的文件。

如上所述,这不是你应该关心的问题。使用多个协调器时,协调员的内存状态及其上下文是一个更加紧迫的问题。

相关问题