我正在考虑使用两个persistent store coordinator
,PSC1
会只读一个SQLite DB
,PSC2
将读写DB
。有时PSC1
将从DB
重新加载内容。两个NSPersistentStoreCoordinator可以使用相同的数据库吗?
你认为这是可能的吗?
您是否认为两个PSC可以以原子方式读取/写入数据库,而不会导致任何损坏?
PSC是否对数据库设置了锁定,以便从其他PSC进行访问?
我正在考虑使用两个persistent store coordinator
,PSC1
会只读一个SQLite DB
,PSC2
将读写DB
。有时PSC1
将从DB
重新加载内容。两个NSPersistentStoreCoordinator可以使用相同的数据库吗?
你认为这是可能的吗?
您是否认为两个PSC可以以原子方式读取/写入数据库,而不会导致任何损坏?
PSC是否对数据库设置了锁定,以便从其他PSC进行访问?
您可以有两个不同的NSPersistentStoreCoordinator
实例访问相同的文件。事实上,多年前这是一个推荐的方法。
但是,这样做有问题。如果一个NSPersistentStoreCoordinator
发生了写入文件系统的更改,另一个NSPersistentStoreCoordinator
实例将不知道它。 NSPersistentStoreCoordinator
和NSManagedObjectContext
维护它们管理的对象的内存状态。使用两个NSPersistentStoreCoordinator
实例会导致它们在某个时刻不同步。例如,如果NSPersistentStoreCoordinator
A从NSPersistentStore
中的记录加载对象,则会有该对象的内存版本。如果NSPersistentStoreCoordinator
B然后删除由相同记录支持的对象,则A的对象版本没有记录。当Core Data试图在A中对该对象进行故障时,您将得到一个异常。
您是否认为两个PSC可以以原子方式读取/写入DB,而不会导致任何损坏?
损坏对于NSSQLiteStoreType商店来说很少出现问题。与其他商店,这当然是可能的。
PSC是否对数据库设置了锁定,以便从其他PSC进行访问?
内置的NSPersistentStore
具体类我们在访问文件系统的记录(但不总是用于元数据)时协调文件。所以是的,有一个锁涉及到,它应该防止两个NSPersistentStore
实例同时修改相同的文件。
如上所述,这不是你应该关心的问题。使用多个协调器时,协调员的内存状态及其上下文是一个更加紧迫的问题。
没有尝试过,但我认为它可以使用NSReadOnlyPersistentStoreOption。结帐https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/index.html#//apple_ref/doc/constant_group/Store_Options – JakubKnejzlik
您可能会对[此方法]感兴趣, (http://martiancraft.com/blog/2015/03/core-data-stack/),它使用2个'NSManagedObjectContext's。 – johnpatrickmorgan
您可能想要展开为什么要这样做。你想要的最后一件事是不必要地过度优化你的核心数据栈。我很想看看你目前看到了什么样的表现,以及为什么你认为你需要协调员来提高这一点。 –