V. iOS 5
У меня есть Model2.xcdatamodelId, связывающийся с 2 сущностями. Моя модель называется 2, потому что у меня уже есть модель Singleton с именем для некоторого управления.
Итак, у меня есть Model2.h и Model2.m.
Моя проблема: В первый раз, моя Model2 инициализируется, я вставляю некоторые данные по умолчанию, затем я фиксирую. Хорошо работает, это говорит о том, что мой Model2 был сохранен правильно. После того, что я читаю мои данные, данные показываются из базы данных ... так что они успешно в базе данных. НО .. при закрытии и уничтожении моего приложения мое приложение, похоже, потеряло все данные ... и начинает заново с созданием данных по умолчанию, поскольку оно пустое ...
СОВЕТ: Я думаю, что моя проблема может быть в инициализации ... в этих строках:
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSURL * storeUrl = [NSURL fileURLWithPath: [basePath stringByAppendingPathComponent: @"ProjectXYZ.db"]];
Поскольку ProjectXYZ.db не существует, он должен его создать? .. Это та часть, где я заблудился ... но, похоже, он работал над другим проектом, над которым я работал ...: S
Вот мой Model2.h
#import <CoreData/CoreData.h>
#import "Photos_Trophies.h"
#import "Trophies.h"
@interface Model2 : NSObject
// High-level methods.
+ (void) commit;
...
// Object Retrieval
+ (NSArray*) trophies;
...
// Object Creation
+ (id) trophiesWithTitle:(NSString *)title;
@end
И мой Model2.m
#import "Model2.h"
#import <UIKit/UIKit.h>
static NSManagedObjectContext * ctx;
@implementation Model2
+ (void) initialize {
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSURL * storeUrl = [NSURL fileURLWithPath: [basePath stringByAppendingPathComponent: @"ProjectXYZ.db"]];
NSError * error = nil;
ctx = [[NSManagedObjectContext alloc] init];
ctx.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
ctx.undoManager = [[NSUndoManager alloc] init];
if (![ctx.persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
NSLog(@"%@", error);
}
//TEMPORARY... these are default trophies for example
if ([[Model2 trophies] count] == 0) {
[self trophiesWithTitle:@"Saved Trophy Test 1"];
[self trophiesWithTitle:@"Saved Trophy Test 2"];
[self trophiesWithTitle:@"Saved Trophy Test 3"];
[self commit];
}
}
+ (void) commit {
NSError* error = nil;
if (![ctx save:&error]) {
NSLog(@"ERREUR DANS COMMIT: %@", error.localizedDescription);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors && [detailedErrors count] > 0) {
for(NSError* detailedError in detailedErrors)
NSLog(@"DetailedError: %@", [detailedError userInfo]);
} else
NSLog(@"%@", [error userInfo]);
} else
NSLog(@"Model2 SAVED");
}
+ (NSArray*) trophies {
NSFetchRequest* req = [[NSFetchRequest alloc] init];
req.entity = [NSEntityDescription entityForName:@"Trophies" inManagedObjectContext:ctx];
req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"trophies_title" ascending:YES]];
NSError* error = nil;
NSArray* objects = [ctx executeFetchRequest:req error:&error];
return objects;
}
+ (id) trophiesWithTitle:(NSString *)title {
Trophies * trophies = [NSEntityDescription insertNewObjectForEntityForName:@"Trophies" inManagedObjectContext:ctx];
trophies.trophies_title = title;
return trophies;
}