我有一个使用CoreData进行存储的iPhone应用程序。
持久性存储(sqlite3数据库)附带了几个填充了数据的实体。这些数据用于在应用程序中创建各种菜单和选项。我们将这些数据称为“应用程序数据”。
应用程序使用其他几个实体来存储用户数据。
虽然架构很少更改,但我经常需要更新应用程序数据以向用户提供新选项。
我有一个MacRuby脚本,它从一堆CSV文件中获取新数据并更新我的开发机器上的sqlite3数据库,但我不确定使用新应用程序数据更新现有已部署应用程序的最佳方法是什么(记住,没有架构更改)而不影响用户数据。
有什么想法吗?
_ 更新 _
经过一番思考后,我开始着手设置应用程序从包含新数据的Web服务器下载新的sqlite3文件。收到后,我的应用程序会将更新sqlite3文件中的数据复制到应用程序的工作数据库文件中,完全替换应用程序数据,但不会触及用户数据。
确定是否已应用更新的机制可以使用具有单个数据库版本号的文本文件,应用程序将定期下载该文件。如果此数字大于先前更新的数量(存储在本地),则更新将继续,否则将忽略它。
答案 0 :(得分:0)
如果您只是在谈论在sqlite3商店中添加新条目,是否有理由在应用程序启动时无法执行此操作?我自己没有必要这样做,但我不明白为什么你不能创建一个包含你需要插入的数据的属性列表,并在应用程序启动时执行更新。
NSString *applicationDataPath = [[NSBundle mainBundle] pathForResource:@"ApplicationData" ofType:@"plist"];
NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"VERSION"];
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
/* Don't bother processing updates if the version last run is the same as the current version. */
if (! [previousVersion isEqualToString:currentVersion])
{
NSArray *versionList = [applicationData objectForKey:@"Versions"];
BOOL process = (nil == previousVersion);
for (NSDictionary *versionData in versionList)
{
NSString *version = [versionData objectForKey:@"version"];
if (process)
{
// Send dictionary for this version update to some method to process it..
[self processUpdate:versionData];
}
if (!process && [version isEqualToString:previousVersion])
process = YES;
}
}
想法是plist包含一个字典数组,描述应用程序的每个版本以及应该为此版本更新的数据。我下面的plist示例缺少任何必需的细节,所以只是一个存根来获得想法。
此外,不知道代码是否真的有效;)我想如果我不得不处理相同的事情,我认为我可能会这样做,假设我正确理解你的问题。
还应注意,使用此功能后,您可能希望更新数据更新后在应用启动时存储在用户默认值中的先前版本,以便它只运行一次。
[{ 版本=( { data = { 1 = { entity =菜单; }; }; version =“1.1”; }, { data = { 1 = { entity =菜单; }; }; version =“1.2”; }, { data = { 1 = { entity =菜单; }; }; version =“1.3”; }, { data = { 1 = { entity =菜单; }; }; version =“2.0”; }, { data = { 1 = { entity =菜单; }; }; version =“2.5”; } ); }]