应用程序运行时切换核心数据sqlite文件?数据无法显示

时间:2016-11-02 18:14:37

标签: ios objective-c sqlite core-data nspersistentstore

我让用户通过iOS设备上的电子邮件备份和恢复sqlite数据库。我成功导出和导入sqlite数据库。我的问题是,当我想用​​新文件替换当前的sqlite文件时,数据不会自动更新。当我在函数末尾添加一个exit(0)时,它会关闭,当重新打开应用程序时,数据就在那里。这不是解决方案,因为它基本上是崩溃。这是我用来替换另一个sqlite文件的函数。 注意我已关闭日记功能,因此整个数据库是一个sqlite文件有人知道在应用程序运行时用另一个sqlite文件替换一个sqlite文件的正确方法吗?谢谢。

- (BOOL)resetApplicationModel {

// ----------------------
// This method removes all traces of the Core Data store and then resets the application defaults
// ----------------------

NSError *_error = nil;
NSURL *_storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"];

NSPersistentStore *_store = [persistentStoreCoordinator persistentStoreForURL:_storeURL];

// Remove the SQL store and the file associated with it
if ([persistentStoreCoordinator removePersistentStore:_store error:&_error]){
    [[NSFileManager defaultManager] removeItemAtPath:_storeURL.path error:&_error];
}

if (_error) {
    NSLog(@"Failed to remove persistent store: %@", [_error localizedDescription]);
    return NO;
}

[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
[managedObjectContext release], managedObjectContext = nil;

NSString *applicationDocumentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *originalFile = [applicationDocumentDirectory stringByAppendingPathComponent:@"Database.sqlite"];

NSString *backupDatabaseFolder = [applicationDocumentDirectory stringByAppendingPathComponent:@"Backups"];
NSString *backupFile = [backupDatabaseFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"DatabaseBackup.sqlite"]];

[[NSFileManager defaultManager] copyItemAtPath:backupFile toPath:originalFile error:nil];

// Rebuild the application's managed object context
rootViewController.managedObjectContext = nil;
rootViewController.managedObjectContext = self.managedObjectContext;

return YES;

}

1 个答案:

答案 0 :(得分:0)

我将假设您的managedObjectContextpersistentStoreCoordinator方法遵循典型方法 - 即在您将它们设置为nil之后,再次要求它们将懒洋洋地重新初始化它们。如果情况并非如此,那么这是第一个问题,那就是您要拆除旧的核心数据堆栈而不是替换它。

假设这是真的,问题是 - 正如您在评论中所说 - 您的应用程序不会尝试获取新数据。如果您希望应用程序显示新数据....您需要让您的应用程序使用获取请求来请求该数据。您的UI不会因为您运行上述方法而自动更新,您需要做一些事情来获取新值。

这样做意味着您需要清除从核心数据中提取的每个对象 - 每个托管对象以及您可能拥有的任何提取的结果控制器