以前,我有一个使用核心数据的应用程序。我使用相同的存储网址来初始化NSManagedObjectModel并创建NSPersistentStoreCoordinator。但是,在新应用程序中,我尝试使用相同的方式,无法创建模型。所以我必须使用一个模型网址(我在这个论坛中找到了它)才能创建NSManagedObjectModel。问题出在哪里?
这是来自旧应用程序:
- (NSString *)storeName
{
return @"ABC.storedata";
}
- (NSURL *)storeUrl
{
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
return storeURL;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel == nil) {
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self storeUrl]];
}
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {
abort();
}
return _persistentStoreCoordinator;
}
这是来自新应用程序:
- (NSString *)storeName
{
return @"DEF.sqlite";
}
- (NSURL *)storeUrl
{
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
return storeURL;
}
- (NSURL *)modelUrl
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DEF" withExtension:@"momd"];
return modelURL;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel == nil) {
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self modelUrl]];
}
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {
abort();
}
return _persistentStoreCoordinator;
}
您永远不能对模型和持久存储使用相同的 URL,因为它们是两个非常不同的东西。
模型 URL 必须指向 Xcode 项目中包含的实际模型资源,这是一个 .momd 文件包。持久存储在您的情况下是一个数据库,文档目录中的 .sqlite 文件。
我无法想象它在过去是如何运作的。一种可能性是,由于您的ABC.storedata没有尾随的.sqlite,Core Data必须在幕后向其添加.sqlite,并且DEF.storedata可能以某种方式与您的模型名称匹配?
这是初始化模型的正确方法,您将"Model"替换为模型资源的 Xcode 项目中的名称:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
至于持久存储,没有限制。在大多数情况下,它应该在应用程序文档目录中。