我想重新创建(删除和创建)persistentStore,不受更改.xcdatamodeld的影响。
我在AppDelegate中编写了一个代码persistentStoreCoordinator,如下所示:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myproject.sqlite"];
// delete if database exists
NSError *error = nil;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// if .xcdatamodeld is changed, fail and in here...
// if not changed, recreate success. all data removed from database
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
NSArray *stores = [_persistentStoreCoordinator persistentStores];
for (NSPersistentStore *store in stores) {
[_persistentStoreCoordinator removePersistentStore:store error:nil];
[[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
// newly create database
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
当我对.xcdatamodeld
进行更改(例如向实体添加新列)并重启模拟器时,首先失败addPersistentStoreWithType
并记录
Unresolved error Error Domain=NSCocoaErrorDomain Code=134100
The operation couldn’t be completed. (Cocoa error 134100.)
我该怎么做?
答案 0 :(得分:1)
解决问题的最简单方法是通过以下方式处理此错误:删除数据库文件并重试。它可以用于测试期间。
但是,如果您需要稳定的解决方案,请使用带版本和自动迁移的模型:
[persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType
configuration: nil
URL: storeURL
options: @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)}
error: &error];
此外,如果自动发电不够,则应提供迁移映射。
如果您只想删除商店,请使用文件管理器:
[[NSFileManager defaultManager] removeItemAtURL: storeURL
error: &error];
答案 1 :(得分:1)
以下代码对我来说似乎很有用。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myproject.sqlite"];
// delete database if exists
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:nil];
// create database
NSError *error = nil;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
我在下面检查过(在设备和模拟器中):
感谢您的建议。