更新sqlite文件而不更改现有应用程序的架构

时间:2015-04-16 09:30:06

标签: ios sqlite

我已经在App Store上有一个现有应用程序,它有一个SQLite文件。 在我的下一个版本中,我想在不更改架构的情况下更新SQLite文件。我刚刚添加了比以前更多的城市数量。

我从App Store下载了旧应用程序。打开它并将其推送到后台。现在我打开Xcode,它有新的SQLite文件并运行代码。应用程序崩溃,给出了有关架构更改的奇怪错误。不知道为什么。错误如下。

The database at /var/mobile/Applications/9C7203DF-770E-419F-B257-ABF769E8210D/Documents/Mydatabase.sqlite is corrupted.  SQLite error code:11, 'database disk image is malformed'

其他几行日志之后。我得到了它崩溃的地方。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name ‘XXXGMOriginAndDestination''
*** First throw call stack:
(0x2d7f8ecb 0x37f93ce7 0x2d549483 0x1e84d9 0x1e6e49 0x447559 0x446a25 0x43e8d1 0x441bef 0x30099ca1 0x300995f3 0x30093ca9 0x3002fc77 0x3002edd9 0x300933e5 0x3269cb55 0x3269c73f 0x2d7c3807 0x2d7c37a3 0x2d7c1f6f 0x2d72c729 0x2d72c50b 0x3009260b 0x3008d871 0x11709f 0x38491ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

它仅在应用程序升级时第一次崩溃应用程序。一旦重启,它工作正常。

2 个答案:

答案 0 :(得分:0)

您应该在开发者网站上阅读这篇文章。 https://developer.apple.com/library/mac/qa/qa1809/_index.html#//apple_ref/doc/uid/DTS40014115

  

Core Data SQLite存储的默认日记记录模式已更改为   iOS 7和OS X Mavericks中的预写日志(WAL)。随着WAL   模式,Core Data保持主存储文件不变并附加   事务到同一位置的-wal文件。核心数据之后   保存上下文,不删除-wal文件,以及其中的数据   文件未合并到商店文件。因此,简单地制作   商店文件的副本可能会导致数据丢失和   不一致性。            如果必须复制存储文件,则在将存储添加到持久性存储协调器时更改为回滚日记模式。

我在创建sqlite数据库时使用这些选项。当我这样做时,只创建了一个文件。如果您在新的应用程序版本中使用此文件,它应该可以工作。你可能不得不给妈妈打电话,但我认为你不会。这假设您没有从Documents文件夹中移动原始sqlite文件。

NSDictionary *options = @{
                                  NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}, // For creation only
                                  NSMigratePersistentStoresAutomaticallyOption: @YES,
                                  NSInferMappingModelAutomaticallyOption: @YES};

答案 1 :(得分:0)

删除db文件时,我还删除了-wal& -shm文件就像这样。这对我有用。

[fileManager removeItemAtPath:writableDBPath error:&error];
[fileManager removeItemAtPath:[NSString stringWithFormat:@"%@-wal",writableDBPath] error:&error];
[fileManager removeItemAtPath:[NSString stringWithFormat:@"%@-shm",writableDBPath] error:&error];

另外

增加XXXX.xcdatamodeld文件的数量也为我修复了它。