【发布时间】:2011-01-22 08:32:39
【问题描述】:
在我的应用程序中,我有时需要重建和重新填充数据库文件。 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 表示文件不存在或不可读。但是创建persistenStoreCoordinator后创建的文件IS,虽然是空的,但是在执行了一些查询之后就消失了。
在这种情况下,指示尝试创建已经存在的表的第二条消息很奇怪。
我很困惑,无法理解这里发生了什么。我的代码如下所示:
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]);
执行此代码后,数据库文件存在但为空。然后执行第一个查询(以及所有后续查询)时,它给了我上面的错误并且文件消失了。
有人知道它有什么问题吗?
非常感谢您指点我正确的方式!
【问题讨论】: