2013-10-18 39 views
3

我有核心数据正确工作(加载,保存)与一个实体称为THSettings。核心数据 - 不能存储两个单独的实体

但是,我想创建另一个不相关的核心数据实体,称为THDetails。

当我在同一个xcdatamodeld文件中创建另一个实体时,它在运行应用程序时会出现此错误:“用于打开商店的模型与用于创建商店的模型不兼容”。

所以我删除的实体,创造了新的实体另一xcdatamodeld文件,现在它使这个错误: “*终止应用程序由于未捕获的异常‘NSInternalInconsistencyException’,理由是:“NSFetchRequest未能找到NSEntityDescription为实体名称'THDetails''“

任何人都可以告诉我为什么这不起作用?我应该能够保存多个不相关的实体...

这里是加载THDetails代码:

-(NSMutableArray *)loadSavedNotes { 
    THAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *moc = [appDelegate managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"THDetails"]; 
    NSMutableArray *detailsList = [[moc executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
    NSLog(@"%d", [detailsList count]); 
    return detailsList; 
} 

这里是加载THSettings代码:

THAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *moc = [appDelegate managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"THSettings"]; 
NSMutableArray *settingsList = [[moc executeFetchRequest:fetchRequest error:nil] mutableCopy]; 


// ... process it 

回答

1

您需要定义一个模型,定义全部您的实体。如果您将其他 实体添加到模型中,您有两种选择:

  • 只需将新实体添加到现有模型。在这种情况下,您必须在运行新代码之前从模拟器或设备中删除应用程序 ,然后才能使用与更改的模型兼容的新的新数据库 开始。这通常在开发过程中完成, 当时不需要保存数据。 OR:
  • 创建模型版本并在初始化堆栈核心数据 时添加“轻量级迁移”选项。在这种情况下,旧模型和新模型都被复制到 应用程序包中,并且核心数据可以(在某些情况下)将旧数据库迁移到新数据库。如果为已经分发的应用程序进行更新,并且您希望保留该数据,则会执行此操作。 “轻量级迁移”适用于模型中的简单更改,例如添加新的实体 。 有关更多信息,请参见"Core Data Model Versioning and Data Migration Programming Guide"
+0

我尝试的第一个选项,并根据需要它的作品。谢谢! – user2894272

+1

@ user2894272:欢迎您,欢迎来到Stack Overflow! –

1

问题是,当您更改模型时,持久性存储(即sqlite数据库)变得与已更改的模型不兼容。 有几种方法来处理这种类型的错误,例如执行轻量级迁移。

最简单的方法是简单地重新持久性存储:

NSError *error = nil; 
NSURL *storeURL = ...; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
        initWithManagedObjectModel:[self managedObjectModel]]; 

// if storeCoordinator can't open at storeURL for some reason 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
               configuration:nil 
                 URL:storeURL 
                options:nil 
                 error:&error]) 
{ 
    // if there is a database - it means it's the problem - delete it 
    if ([[NSFileManager defaultManager] fileExistsAtPath:storeURL.path]) 
    { 
     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; 

     // if storeCoordinator still can't open a database, means some other error 
     if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                 configuration:nil 
                   URL:storeURL 
                  options:nil 
                   error:&error]) 
     { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Database structure has changed. All information had been erased" 
                  message:nil 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil, nil; 
     [alertView show]; 
    } 
} 
+0

是的,如果所有其他(如迁移)失败,重新创建商店可能比让应用崩溃更好。 –