gpt4 book ai didi

iphone - 如何强制coredata重建sqlite数据库模型?

转载 作者:IT王子 更新时间:2023-10-29 06:19:55 26 4
gpt4 key购买 nike

在我的应用程序中,我有时需要重建和重新填充数据库文件。 SQLite 数据库由 CoreData 堆栈创建和管理。

我想做的是删除文件,然后简单地重新创建 persistentStoreCoordinator 对象。

它可以在模拟器下运行,但不能在设备上运行,我会遇到这样的错误:

NSFilePath = "/var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite";
NSUnderlyingException = I/O error for database at /var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite. SQLite error code:1, 'table ZXXXX already exists';

我无论如何都找不到原因。它表示两个不同的问题 - Cocoa 错误 256 表示文件不存在或不可读。但是文件IS是在创建persistenStoreCoordinator之后创建的,虽然它是空的,但是在执行一些查询之后它就消失了。

在这种情况下,第二条消息指示尝试创建现有表是很奇怪的。

我很困惑,不明白这里发生了什么。我的代码如下所示:

NSString *path = [[WLLocalService dataStorePath] relativePath];
NSError *error = nil;

WLLOG(@"About to remove file %@", path);

[[NSFileManager defaultManager] removeItemAtPath: path error: &error];

if (error != nil) {
WLLOG(@"Error removing the DB: %@", error);
}


[self persistentStoreCoordinator];

WLLOG(@"Rebuild DB result %d", [[NSFileManager defaultManager] fileExistsAtPath: path]);

执行此代码后,DB文件存在但为空。然后执行第一个查询(以及所有后续查询)时,它会给我上面的错误并且文件消失。

有人知道它有什么问题吗?

非常感谢您为我指明正确的道路!

最佳答案

Core Data 栈不喜欢你删除它下面的文件。如果你想删除文件,你应该拆除堆栈,删除文件,然后重建堆栈。这将消除问题。

部分问题是堆栈保留了文件中数据的缓存。当您删除文件时,您无法清除该缓存,然后您会将 Core Data 置于未知和不稳定的状态。

您可以尝试通过调用 -removePersistentStore:error: 告诉 NSPersistentStoreCoordinator 您正在删除文件,然后通过调用 添加新存储-addPersistentStoreWithType:configuration:URL:options:error:。我目前在 ZSync 中这样做,它工作得很好。

关于iphone - 如何强制coredata重建sqlite数据库模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com