我已经在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
它仅在应用程序升级时第一次崩溃应用程序。一旦重启,它工作正常。
答案 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文件的数量也为我修复了它。