应用程序包中预填充的 sqlite 文件。现有用户更新后会发生啥?
Posted
技术标签:
【中文标题】应用程序包中预填充的 sqlite 文件。现有用户更新后会发生啥?【英文标题】:Prepopulated sqlite file in the app bundle. What happens after the existing users update?应用程序包中预填充的 sqlite 文件。现有用户更新后会发生什么? 【发布时间】:2015-02-12 09:12:08 【问题描述】:我在商店里有一个应用程序,它指向文档目录中的 appname.sqlite 文件。这是旧代码:
NSURL *storeURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"MyApp.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@NSMigratePersistentStoresAutomaticallyOption : @YES,NSInferMappingModelAutomaticallyOption : @YES; error:&error])
abort();
我现在想提供一个更新。新功能是捆绑包中的预填充 .sqlite 数据库。请参阅以下内容
NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"MyNewPrefilled" ofType:@"sqlite"]];
在全新安装应用程序时可以正常工作。但是登录并在数据库中保存大量数据(应用程序目录中的旧sqlite)的用户会发生什么?我会丢失它,因为我现在指向的是应用程序包 (MyNewPrefilled.sqlite) 中的 .sqlite,而不是应用程序目录之一。如何将 doc 目录的旧 sqlite 文件中的旧数据恢复到 bundle 中的新文件?
仅供参考:我已经使用代码数据迁移(涉及数据模型中的版本号),当我在更新中更改数据模型时可以正常工作。
【问题讨论】:
你要复制的数据是静态数据吗?还是用户会改变它? 请注意,包中的文件是只读的。 【参考方案1】:Apple 建议使用两个持久性存储(在同一模型中)来分隔用户生成的数据和静态数据。据推测,如果您的数据是静态的,那么您应该这样做并为静态数据提供只读存储。例如,请参阅核心数据编程指南中的 Configurations。
另一种方法是
-
将捆绑种子数据库复制到文档目录中,然后
从旧存储中读取数据并
将其复制到新的。
最后,您可以删除旧商店。
【讨论】:
是的,我的数据是静态的。只读。 我一直在考虑从旧存储中读取数据并复制到新问题中。这正是我发布问题的目的。我的问题:我该怎么做?我究竟如何“从旧存储读取数据并将其复制到新存储”? 只需从旧存储中获取所有内容,遍历结果,将具有相同数据的新实体插入到新存储中。 我采用了“配置”方式。谢谢!!有用!非常感谢!以上是关于应用程序包中预填充的 sqlite 文件。现有用户更新后会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据先前的用户选择在 Django 中预填充(多个)ChoiceField
如何在 React Native 应用程序中预填充 TextInput?