应用程序包中预填充的 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?

在 PHP 中预填充 AcroForms PDF

在 Django Admin FilteredSelectmultiple 小部件中预填充选定值

应用程序包中的只读 SQLite 数据库

iOS - 将 sqlite 复制到 CoreData 的捆绑包