2012-03-05 275 views
1

我已經開始將核心數據集成到當前項目中,這是我第一次使用它。核心數據對象不會存儲

我已經設法將新對象寫入我的NSManagedObjectContext並將其讀出。我的問題是,在關閉應用程序後,所有對象都會丟失。這裏是添加新對象的功能之一:

-(void)addExpenseWithValue:(NSNumber *)value name:(NSString *)name type:(BOOL)type andDate:(NSDate *)date{ 

//get the right managed object context 
NSManagedObjectContext *context = self.managedObjectContext;  

//creat a new expense in context 
NSManagedObject *newExpense = [NSEntityDescription insertNewObjectForEntityForName:@"Expense" inManagedObjectContext:context]; 

//Get Number representation of month and year 
NSNumber *monthNumber = [self getMonthNumber:date]; 
NSNumber *dayNumber = [self getDayNumber:date]; 

//set values of the expense 
[newExpense setValue:[NSDate date] forKey:@"date"]; 
[newExpense setValue:value forKey:@"value"]; 
[newExpense setValue:name forKey:@"name"]; 
[newExpense setValue:[NSNumber numberWithBool:type ] forKey:@"expenseType"]; 
[newExpense setValue:monthNumber forKey:@"month"]; 
[newExpense setValue:dayNumber forKey:@"day"]; 
[self storeData]; 
} 


-(void)storeData{ 
NSError *error = nil; 
[managedObjectContext save:&error]; 

} 

對象實際上是存儲的,我可以在之後讀出它們。據我所知它與persistentStorepersistentStoreCoordinator有關。我appDelegate有以下方法來實現:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
              stringByAppendingPathComponent: @"<Project Name>.sqlite"]]; 
NSError *error = nil; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil URL:storeUrl options:nil error:&error]) { 
    /*Error for store creation should be handled in here*/ 
} 

return persistentStoreCoordinator; 
} 

- (NSManagedObjectContext *) managedObjectContext { 
if (managedObjectContext != nil) { 
    return managedObjectContext; 
} 

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (coordinator != nil) { 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
} 

return managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
if (managedObjectModel != nil) { 
    return managedObjectModel; 
} 
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil] ; 

return managedObjectModel; 
} 



- (NSString *)applicationDocumentsDirectory { 
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

UPDATE:

我添加了一個小testfunction,嘗試它被稱爲第一的viewController:

-(void)test{ 

NSArray* stores = [[managedObjectContext persistentStoreCoordinator]persistentStores]; 
if ([stores objectAtIndex:0]==nil) { 
    NSLog(@"no stores found"); 
} 
else 
    NSLog(@"%d", [stores count]); 

} 

managedObjectContext是應用NSanagedObjectContext如在appdelegate中發起的那樣。它的存在,則數組被分配,但計數停留在0

2012-03-06 20:09:37.772 DailyBudget[1533:fb03] *** Terminating app due to uncaught 
exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond  
bounds for empty array' 
*** First throw call stack: 
(0x135f052 0x174fd0a 0x134b674 0x3c6a 0x3894 0x46cfbf 0x46d21b 0x4838b1 0x46cfbf 
0x46d21b 0x46e0f1 0x3dcfec 0x3e2572 0x3dc72b 0x3cbbc2 0x3cbce2 0x3cbea8 0x3d2d9a 0x25b3 
0x3a39d6 0x3a48a6 0x3b3743 0x3b41f8 0x3a7aa9 0x1f57fa9 0x13331c5 0x1298022 0x129690a 
0x1295db4 0x1295ccb 0x3a42a7 0x3a5a9b 0x2488 0x23e5 0x1) 
terminate called throwing an exception(gdb) 

的錯誤,我有以下對象的時刻:

objects that exist

我失去了什麼?

+0

錯誤是否爲無? [managedObjectContext save:&error]是否爲TRUE? – NeverBe 2012-03-05 22:14:31

+0

如果您使用'NSArrayController'來顯示數據,請確保它們具有'setAutomaticallyPreparesContent:YES'(類似於IB中的「準備內容」)。 – spudwaffle 2012-03-06 06:51:29

+0

你可以檢查持久存儲的創建是否正常? - [NSPersistentStoreCoordinator persistentStores]返回什麼? – Aderstedt 2012-03-06 06:58:54

回答

0

... 24小時後。我不知何故能夠自己解決=) 我認爲這個問題存在於storeURL中。我的新代碼從這個帖子在這裏受到啓發:

Adding CoreData to Existing Project (theappcodeblog.com)

感謝您的傢伙檢查出來,反正=)

新代碼(工作):

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTabBarTutorial.sqlite"]; 

與功能

- (NSURL *)applicationDocumentsDirectory { 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
}