关于核心数据和预先填充模型的问题

时间:2012-09-07 16:55:21

标签: ios sqlite core-data

要在首次启动时在我的应用程序中预先填充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;
}

似乎有效。但我有两个问题:

  1. 如果sqlite文件只是一个数据库文件而实际上并不包含任何图像,那么应用程序在首次启动时如何查找并加载图像?
  2. 即使在应用程序的后续运行中,我每次都会看到“创建新商店”。为什么_persistentStoreCoordinator总是为零?我清楚地在代码中设置它。

1 个答案:

答案 0 :(得分:0)

  1. 可以将图像存储在数据库文件中,通常是二进制blob(看起来像Core Data中的NSData实例)。如果您可以提供有关模型或存储/加载图像的代码的更多信息,我们可以更具体。
  2. 每次在此实例中启动应用程序时,
  3. “创建新商店”预期将被记录。尽管SQLite文件在磁盘上是持久的,但是当您的应用程序终止时,您不能指望代码中的数据结构能够存在 - 您需要在每次启动时为程序创建一个新的持久存储对象。

    将其视为分配NSInteger x = 10,然后期望能够在保持x具有值10的同时退出并重新启动您的程序。这不是程序的工作方式 - 您需要重新分配x = 10之前,您可以阅读x并获得10。变量_persistentStoreCoordinator在这里的工作方式相同。