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

Ste*_*abs 4 sqlite xcode 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;
Run Code Online (Sandbox Code Playgroud)

}

ndf*_*red 5

您可以:

  1. 从服务器下载新数据库
  2. 重置整个Core Data上下文(存储协调器,托管对象上下文,托管对象)
  3. 用新的数据库替换旧数据库
  4. 要求UI刷新以显示最新内容:Core Data上下文应该懒得重新加载

但是这种方法非常危险,因为您必须确保应用程序中的每个Core Data对象都可以重置.此外,更换数据库应该在重置上下文后发生,以避免竞争条件.如果你有线程/块访问Core Data,那就更难了.

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

如果你关心带宽,我使用的协议缓冲区比任何JSON甚至sqlite文件都要紧凑,而且非常容易使用.