2011-08-12 33 views
4

我的应用程序当前有这个sqlite文件(让它命名为v1) 我想要做的是当我激活一个IBAction时,它会自动删除当前文件(v1) web服务和存储在新文件(v2)中的值,然后应用程序将使用新的sqlite文件(v2)更新/替换应用程序中的CoreData sqlite文件

有关如何实现的任何想法?

我当前的代码是在这里:

- (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; 

}

回答

5

您可以:

  1. 从服务器下载新的数据库
  2. 重置整个核心数据上下文(商店协调员,管理对象上下文,管理对象)
  3. 替换旧的d用新
  4. atabase要求用户界面刷新,以显示最新内容:核心数据方面应该懒洋洋地重新加载

但这种做法是相当危险的,因为你必须确保每个核心数据您的应用中的对象可以重置。此外,在重置上下文之后,应该更换数据库,以避免竞争状况。如果您有线程/块访问核心数据,则更加困难。

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

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

+0

ndfred我目前面临同样的问题。我会尝试你的步骤1-4,谢谢你的答案。删除或更新数据库是一种很好的方法,但不是当您拥有大型数据库时。在处理数千条记录和关系时,您会发现这可能非常缓慢。根据我的经验处理大型数据库时要更换db。 – CodeMilian

相关问题