在app中更新/替换CoreData sqlite文件

时间:2011-08-12 09:34:18

标签: xcode sqlite core-data

我的应用程序目前有这个sqlite文件(让我们将其命名为v1) 我想要做的是,当我激活IBAction时,它会自动删除当前文件(v1)并从webservice中检索值并存储在新文件(v2)中,然后应用程序将使用新的sqlite文件(v2)

关于如何实施的任何想法?

我目前的代码在这里:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"test.sqlite"]];
NSLog(@"%@",storeUrl);


NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator;

}

1 个答案:

答案 0 :(得分:5)

你可以:

  1. 从服务器下载新数据库
  2. 重置整个Core Data上下文(存储协调器,托管对象上下文,托管对象)
  3. 用新的数据库替换旧数据库
  4. 要求用户界面刷新以显示最新内容:核心数据上下文应该延迟重新加载
  5. 但是这种方法非常危险,因为您必须确保应用中的每个Core Data对象都可以重置。此外,更换数据库应该在重置上下文后发生,以避免竞争条件。如果你有线程/块访问Core Data,那就更难了。

    更好的方法可能是通过下载包含新数据库内容的JSON文件来更新数据库记录,删除旧记录并插入新记录。这还可以确保您可以在未来版本的应用程序中更新Core Data架构,而不会破坏内容更新过程。通过使用NSFetchResultsController类,您的表视图或其他UI元素甚至可以在数据库更新时使用漂亮的动画自动更新。

    如果你关心带宽,我会使用protocol buffers,它比任何JSON甚至sqlite文件更紧凑,而且非常容易使用。