我想刪除我的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