我想删除我的sql lite文件并重新设置持久性存储。删除先前的sqlite存储文件后重新创建持久性存储
//Explicitly write Core Data accessors
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
- (void) setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{}
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil] ;
return managedObjectModel;
}
-(void) setManagedObjectModel:(NSManagedObjectModel *)managedObjectModel{}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Port.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
NSLog(@"Could not create store .... %@", error);
/*Error for store creation should be handled in here*/
}
return persistentStoreCoordinator;
}
我想重置我的场景是这样
- (void)reset {
// Release CoreData chain
self.managedObjectContext = nil;
self.managedObjectModel = nil;
self.persistentStoreCoordinator = nil;
// Delete the sqlite file
NSError *error = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Port.sqlite"]];
if ([fileManager fileExistsAtPath:storeUrl.path]){
[fileManager removeItemAtURL:storeUrl error:&error];
}
self.managedObjectContext = [self managedObjectContext];
self.managedObjectModel = [self managedObjectModel];
self.persistentStoreCoordinator = [self persistentStoreCoordinator];
// handle error...
}
同时节省我得到一个错误:
+ (BOOL)saveAll {
// [self createStorage];
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = [(WSSMobileAppsAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
if (![managedObjectContext save:&error]) {
NSLog(@"Error while saving %@", error);
return FALSE;
}
return TRUE;
}
错误:
Error while saving Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x7195ac0 {NSAffectedStoresErrorKey=(
"<NSSQLCore: 0x714eee0> (URL: file://localhost/Users/.../Library/Application%20Support/iPhone%20Simulator/5.0/Applications/CEDB9019-1D64-4968-9BE7-57E1493B96EC/Documents/Port.sqlite)"
), NSUnderlyingError=0x7195a50 "The operation couldn’t be completed. (Cocoa error 4.)", NSFilePath=/Users/.../Library/Application Support/iPhone Simulator/5.0/Applications/CEDB9019-1D64-4968-9BE7-57E1493B96EC/Documents/Port.sqlite}
我只如果我运行我的重置功能,会得到错误。我认为设置:
self.managedObjectContext = nil;
self.managedObjectModel = nil;
self.persistentStoreCoordinator = nil;
...将解决问题。然后一切都会重新创建。请帮忙。
非常感谢您的回答。现在没有错误,但是如果我运行重置,则不会有任何存储。我在保存后立即执行提取操作
if (![managedObjectContext save:&error]) {
NSLog(@"Error while saving %@", error);
return FALSE;
}
CoreDataPortService *c = [[CoreDataPortService alloc] init];
NSLog(@"Saved all.... got number of ports ... %d", [[c getPorts] count]);
我如果不运行我的重置方法,一切都按预期工作。什么可能是错误的?
我认为这一点是你想删除所有的数据。没有?如果删除该文件并删除内存中的managedObjectContext,则数据将消失。如果你想删除文件并从内存中重新创建文件,那么你需要一种不同的方法。我无法想象为什么你会这么做。在正常情况下,持久性存储将与您在托管对象上下文中保持同步。 – morningstar
我想删除这些数据。是否也可以删除文件。那是因为有时候我改变实体。 – pethel
你说,“如果我运行我的重置,没有任何东西被存储”。听起来你不想存储任何内容,即删除了所有内容。你的意思是你运行重置,然后添加对象,然后保存,并且之后没有对象? – morningstar