要在首次启动时在我的应用程序中预先填充CoreData,我已经包含了一个PreModel.sqlite文件,该文件以前是由应用程序根据从Web服务下载的数据创建的,其中包括图像。
要填充模型,我这样做:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSLog(@"creating new store");
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PreModel.sqlite"];
if(![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
NSString *sqlitePath = [[NSBundle mainBundle] pathForResource:@"PreModel" ofType:@"sqlite"];
if (sqlitePath) {
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:sqlitePath toPath:[storeURL path] error:&error];
if (error) {
NSLog(@"Error copying sqlite database: %@", [error localizedDescription]);
}
}
}
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;
}
似乎有效。但我有两个问题:
_persistentStoreCoordinator
总是为零?我清楚地在代码中设置它。答案 0 :(得分:0)
“创建新商店”预期将被记录。尽管SQLite文件在磁盘上是持久的,但是当您的应用程序终止时,您不能指望代码中的数据结构能够存在 - 您需要在每次启动时为程序创建一个新的持久存储对象。
将其视为分配NSInteger x = 10
,然后期望能够在保持x
具有值10的同时退出并重新启动您的程序。这不是程序的工作方式 - 您需要重新分配x = 10
之前,您可以阅读x
并获得10。变量_persistentStoreCoordinator
在这里的工作方式相同。