1

現在のプロジェクトでコア データの統合を開始しましたが、それを使用するのは初めてです。

新しいオブジェクトを my に書き込んNSManagedObjectContextで読み取ることができました。私の問題は、アプリを閉じるとすべてのオブジェクトが失われることです。以下は、新しいオブジェクトを追加する関数の 1 つです。

-(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];

}

オブジェクトは実際に保存され、後で読み取ることができます。私が知る限り、それは and と関係がpersistentStoreありpersistentStoreCoordinatorます。myappDelegateには次のメソッドが実装されています。

- (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];
 }

アップデート:

最初のviewControllerで呼び出される実験のために、小さなテスト関数を追加しました:

-(void)test{

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

}

managedObjectContextNSanagedObjectContextappdelegate で開始されたアプリケーションです。存在する場合、配列は割り当てられますが、カウントは 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) 

エラーの時点で、次のオブジェクトがあります。

存在するオブジェクト

私は何が欠けていますか?

4

1 に答える 1

0

... 24時間後。私はどうにかして自分で解決できました =) 問題は storeURL 内にあると思います。私の新しいコードは、この投稿からインスピレーションを得ました:

CoreData を既存のプロジェクトに追加する (theappcodeblog.com)

とにかくそれをチェックしてくれてありがとう=)

新しいコード (作業中):

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

機能付き

- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
于 2012-03-07T12:58:22.867 に答える