对于我的第一个IOS应用程序,我计划合并CoreData,但是我不确定应该使用的正确设计模式。
在我的应用程序委托(delegate)中,我具有以下3个属性。
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
我觉得使用这些对象的最好方法是将它们注入(inject)所有需要从CoreData内部访问数据的相关 View Controller 的构造函数中。
我可以想到的最干净的方法是为我的数据模型中的每个表创建某种存储库类,该类将容纳上述3个对象并提供用于访问表数据的辅助方法,例如fetchAllTeams()。然后可以将这些存储库类注入(inject)到相关的 View Controller 中,而不是注入(inject)上面的所有3个对象。
这听起来像在CoreData和Objective-c领域中做的正确的事情吗?
另外,创建这些存储库类的最佳方法是什么,我应该从appDelegate(自动生成)中删除默认的核心数据代码和属性,并将其放置在抽象存储库类中。
存储库的每个实例应具有其自己的NSPersistentStoreCoordinator,NSManagedObjectModel和NSManagedObjectContext版本,还是应在appDelegate传入的所有存储库实例之间共享这些对象的单个实例。
最佳答案
首先,Core-Data设置的基本代码会使整个事情变得非常困惑。需要理解的是,Core-Data是一种围绕各种数据库技术(sqlite,binary,xml)的包装,通过这样做,您无需直接接触数据库。您一开始要担心的主要类是NSManagedObjectContext
。可以将其视为基础数据库的快照,您可以根据需要对其进行修改,完成后将该NSManagedObjectContext
写入数据库。您真正拥有的其他类实际上只需要更细粒度的低级控制,并且由于这是您的第一个应用程序,因此最好不要理会这些。您应该使用read this,它很大,但是您将从中获得很多理解,尤其是一切之间的联系方式及其作用。
总结一下:
NSManagedObjectContext
NSManagedObjectContext
会为您执行此操作……有点……它将有条件地将对象加载到内存中,这有很多,但是开始的地方是学习什么错误是(所有在Apple文档中NSManagedObjectContext
或NSManagedObject
下的错误)NSManagedObject
子类化以表示您的Core-Data对象,并在其中放置逻辑和验证- super 方便。 NSFetchRequest
和NSPredicate
的类,它们是从NSManagedObjectContext
中获取对象的两个核心类。 NSFetchedResultsController
的类,这些类可以很好地绑定(bind)到UI对象(如UITableView
)中。 最后,Core-Data是一头野兽,通常您会发现自己一直在重复执行常见任务。您应该查看this excellent framework,它添加了各种帮助程序(例如
NSManagedObjectContext
的一个易于访问的实例,以及一个获取,创建,删除一行对象)。