Xcode核心数据:将现有XML更改为Sqlite(NSXMLStoreType为NSSQLiteStoreType)

时间:2014-02-05 01:13:21

标签: ios xcode macos sqlite core-data-migration

在我的第一个应用程序中,我在持久存储协调器中使用了NSXMLStoreType。

[storeCooordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:storeURL options:options error:nil];

现在,我想更改为NSSQLiteStoreType:

[storeCooordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:nil];

如果我只是更改商店类型,应用程序崩溃了。那我该怎么办?我可以做一次:

  • 检查旧商店是否存在且
  • 如果是,则将其转换为sqlite和
  • 之后删除旧的xml商店?

我不知道如何将其转换为sqlite。模型是一样的。

  

编辑& ANSWER

我使用此解决方案迁移一次数据库(感谢Volker

//-> applicationFilesDirectory is the url to the documents directory

NSURL* oldURL = [applicationFilesDirectory URLByAppendingPathComponent:@"DBName1.xml"];
NSURL* newURL = [applicationFilesDirectory URLByAppendingPathComponent:@"DBName2.sqlite"];
NSError *error = nil;
NSFileManager * fileManager = [NSFileManager defaultManager];

        //-> if file exists            
        if ([fileManager fileExistsAtPath:[oldURL path]]) {
            NSLog(@"File is here");

            NSManagedObjectModel* managedModel = [NSManagedObjectModel mergedModelFromBundles:nil];
            NSPersistentStoreCoordinator* tempCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedModel];

            id xmlStore =  [tempCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:oldURL options:options error:nil];

            [tempCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:newURL options:options error:nil];

            if ( ![tempCoordinator migratePersistentStore:xmlStore toURL:newURL options:options withType:NSSQLiteStoreType error:&error] ) {
                //-> delete the old file from directory
                [fileManager removeItemAtURL:oldURL error:NULL];
            }
        }

1 个答案:

答案 0 :(得分:3)

您可以按Apples Core Data documentation

中所述使用migratePersistentStore:toURL:options:withType:error:

如果这应该自动发生,则需要在启动时添加迁移。