2011-02-19 57 views
1

我想通過刪除應用程序的sqlite文件重置數據存儲清理。我在數據輔助類寫了這個功能:核心數據:爲什麼刪除sqlite文件並沒有立即清除以前的所有數據?

-(void) resetPersistenStore { 
    NSError *error = nil; 
    [persistentStoreCoordinator_ release]; 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"]; 
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 
    if (error) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    managedObjectModel_ = nil; 
} 

我把這個的UIApplication以下測試:: didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    /* test */ 
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [self resetPersistenStore]; 
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [TestDataHelper testPopulateTestData:[self managedObjectContext]]; 

而是一組由功能的populateTestData創建的數據,我可以清楚地看到三組數據(因爲我稱爲函數三次)

顯然,resetPersistenStore()的作品,因爲沒有它,數據將繼續積累。

所以我的問題是:

爲什麼重置不會立即生效?

我已經設置managedObjectContext爲零在重置功能,但它沒有幫助。

這裏是我的populateTestData功能

+(void)populateTestData:(NSManagedObjectContext*)managedObjectContext { 

    Stock* s1 = (Stock*)[NSEntityDescription insertNewObjectForEntityForName:@"Stock" 
                    inManagedObjectContext:managedObjectContext]; 
    s1.code = @"ABC2"; 
    s1.name = @"ABC"; 
    s1.enteredBy = @"akong"; 

    [managedObjectContext save:&error]; 

    if (error) { 
     NSLog(@"Data error %@", [error description]); 
    } else { 
     NSLog(@"Init completed"); 
    } 
} 

回答

1

即使上下文populateTestData保存的數據,它仍然在它加載的數據。

假設應用程序啓動時,該文件有3個對象。現在,第一條消息將一個對象添加到上下文中,並保存它。所以文件中有4個對象,上下文中有1個。在第二條消息之後,在文件中5,在上下文中2。現在文件已經消失,但上下文中仍然有2個。現在最後的消息將另一個對象添加到上下文和文件中,所以有3個對象。

你說設置managedObjectContext爲零在重置功能沒有幫助。我懷疑上下文是否已經在那裏正確重置。改爲嘗試[managedObjectContext reset]。

+1

我在managedObjectModel_ = nil之前添加了[managedObjectContext reset]但它沒有任何影響 – 2011-02-19 07:08:39

0

我只是在這裏猜測,但你是否有機會使用fetchedResultsController來驗證/顯示這些操作的結果?如果是這樣,嘗試將緩存設置爲零,看看是否有幫助。

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"xxxxxxxx" cacheName:nil]; 

乾杯, 羅格

+0

或者,刪除緩存:`[NSFetchedResultsController deleteCacheWithName:]` – LandedGently 2011-03-17 21:39:26

0

它可以簡單地是模擬器的假象。如果您正在模擬器中運行,您可能需要重置它。從iOS模擬器菜單中,選擇重置內容和設置...

相關問題