2013-10-14 96 views
-3

我與我重新在coreData數據的工作,下面是我的代碼在CoreData核心數據重置

- (void) resetApplicationModel 
{ 
    __managedObjectContext = nil; 
    __managedObjectModel = nil; 
    __persistentStoreCoordinator = nil; 
    _allPageViewController.controller = nil; 


    NSError *error; 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"abc.sqlite"]; 


    if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) 
    { 
     // remove the file containing the data 
     if([[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]) 
     {   

      //recreate the store like in the appDelegate method 
      if([self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error] == nil) 
      { 
       NSLog(@"could not create new persistent store at %@ - %@", [storeURL absoluteString], [error localizedDescription]); 
      } 
     } 
     else 
     { 
      NSLog(@"could not remove the store URL at %@ - %@", [storeURL absoluteString], [error localizedDescription]); 
     } 

    } 
    else 
    { 
     NSLog(@"could not remove persistent store - %@", [error localizedDescription]); 
    } 
} 

此代碼工作正常我所有的表中的數據被刪除重置我的數據。現在,當我嘗試再次添加,我得到這個錯誤

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. attempt to insert row 3 into section 0, but there are only 0 rows in section 0 after the update with userInfo (null) 

我試圖調試這個問題,我才知道,我的數據庫是空的。但我不明白爲什麼。如果我沒有重置運行應用程序,evrything工作正常。

所以,請幫助我。

這是我對FRC代表

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 

     [m_tableView beginUpdates]; 

} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
      atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 

    if (!m_userDrivenModelChange) 
    {   
     switch(type) 
     { 
      case NSFetchedResultsChangeInsert: 
       [m_tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       break; 

      case NSFetchedResultsChangeDelete: 
       [m_tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       break;  
     } 
    } 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath 
{  
     switch(type) { 
      case NSFetchedResultsChangeInsert: 
       [m_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
       break; 

      case NSFetchedResultsChangeDelete: 
       [m_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       break; 

      case NSFetchedResultsChangeMove: 
       [m_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       [m_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; 
       break; 
     }  
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 

     [m_tableView endUpdates]; 
} 

應用在[m_tableView endUpdates]行崩潰的代碼。

問候 蘭吉特

+0

您仍然在'_persistentStoreCoordinator'上調用'addPersistentStore ...',您剛剛設置爲nil。這條線不會做任何事情。另外,你得到的異常來自你的NSFetchedResultsController,並且你沒有向我們展示任何關於它的東西。 – Abizern

+0

@Abizern,我應該使用self.persistentStoreCoordinator的權利。並檢查我更新的問題。 – Ranjit

回答

1

我不知道這是什麼原因,但你設置

__managedObjectContext = nil; 
__persistentStoreCoordinator = nil; 

後你叫

if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:  [[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) 

所以如果你有getter方法(如默認xcode創建它們)你再次初始化它們,如果沒有,那麼你調用nil對象的方法。

編輯:試圖解釋(更好)

設置

__managedObjectContext = nil; 

在調用

[self.managedObjectContext persistentStoreCoordinator] 

這意味着

[nil persistentStoreCoordinator] 

,除非你有

- (NSManagedObjectContext *)managedObjectContext 

方法在類中。如果您擁有該方法,則會再次爲相同(舊)數據模型創建managedObjectContext。

所以,如果你想創建新的協調器,上下文...與新的模型文件,然後你需要設置它們爲零後刪除舊文件。

+0

我已更新我的回答 – Mert

+0

檢查我更新的問題。這是你的建議嗎? – Ranjit

+0

將它們設置爲nil後,只需調用self.persistentStoreCoordinator並自動添加PersistentStore,則不需要添加自己。或者你必須添加_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];在設置它們爲零後,像persistentStoreCoordinator方法在appdelegate – Mert