2013-08-17 53 views
1

插入Core Data突然停止工作。 我使用以下代碼設置了我的persistentStoreCoordinator。請注意0​​是Spot.sqlite未插入CoreData對象

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Spot.sqlite"]; 
    NSError *error = nil; 
    _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(); 
    } 

    return _persistentStoreCoordinator; 
} 

我運行應用程序,並執行

cd ~/Library/Application Support/iPhone Simulator/7.0/Applications 
find . -name MyAppName 
A1DF7916-AE39-4367-BFD2-22A8BAA2AFD2 
cd A1DF7916-AE39-4367-BFD2-22A8BAA2AFD2/Documents 
ls 
(results) Spot.sqlite      Spot.sqlite-shm     Spot.sqlite-wal 
sqlite3 Spot.sqlite 
sqlite> .tables 
ZMYCATEGORY Z_METADATA Z_PRIMARYKEY 
sqlite> select * from ZMYCATEGORY; 

,並顯示沒有結果,但我得到一個線路輸出,當我選擇Z_METADATA內容。

這是我使用的管理對象上下文對象插入代碼:

+ (void)insertParentCategoriesIntoCoreDataFromArray:(NSArray *)array { 
    ROAppDelegate *delegate = (ROAppDelegate *)[UIApplication sharedApplication].delegate; 
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext]; 

    NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"ROCategory" inManagedObjectContext:managedObjectContext]; 

    for (int i = 0; i < [array count]; i++) { 
     ROCategory *category = [[ROCategory alloc] initWithEntity:categoryEntity insertIntoManagedObjectContext:managedObjectContext]; 
     NSArray *mySQLRow = [array objectAtIndex:i]; 
     NSString *name = [mySQLRow objectAtIndex:1]; 
     [category setValue:name forKey:@"name"]; 
    } 
} 

當我通過這段代碼步驟,它是如我所料執行。沒有錯誤發生。但仍然相關的sqlite表是空的,當我運行下面的代碼時,我得到一個空的結果集。

  ... 
      NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
      request.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name ==[c] \'%@\'", key]]; // the [c] means case-sensitive 
      [request setEntity:categoryEntity]; 

      NSError *error; 
      fetchedObjects = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
+2

記得保存。 – Kevin

回答

0

我忘記了save

我包括此代碼,它的工作:

NSError *error = nil; 
if (![[((ROAppDelegate *)[UIApplication sharedApplication].delegate) managedObjectContext] save:&error]) { 
    // error           
} 
+0

這裏有一個提示:回到你的應用程序委託來獲取託管對象的上下文讓你看起來像一個noob。通過堆棧傳遞上下文。當你開始使用多個上下文時,你會發現這變得更有意義。 – Abizern

+1

而不是在堆棧上傳遞上下文,創建一個單例持久化控制器來處理核心數據堆棧的通貨膨脹和一個返回臨時上下文的getter,以及可能的另一種便捷方法來保存父上下文,具體取決於您設計的方式你的上下文關係。 –