2012-09-07 28 views
0

要在首次启动时在我的应用程序中预先填充CoreData,我已经包含一个PreModel.sqlite文件,该文件以前由应用程序从它从Web服务下载的数据创建,其中包括图片。关于CoreData和预填充模型的问题

要填充模型,我这样做:

- (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总是零?我清楚地在代码中设置它。
+0

问题1:说说模型的事情?你用来存储图像的属性如何?它是否包含路径或二进制数据? –

+0

问题2:您是否设置了整个Core Data堆栈? –

回答

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

    把它想分配NSInteger x = 10,则期待能够退出并重新启动程序,同时保持x的值为10。这不是程序如何工作 - 你需要重新分配x = 10之前,你可以期望读x并获得10回。变量_persistentStoreCoordinator在这里以相同的方式工作。

+0

谢谢。我像这样存储数据:NSData * dataResponse = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; [managedObject setValue:dataResponse forKey:@“image”];所以我猜这是二进制的斑点。这有减少应用程序下载大小的好副作用。 – soleil

+0

和#2也有意义。 – soleil

+0

很高兴能帮到你!请注意一点:通常在后台执行大量数据下载是个好主意。通常,您可以通过使用来自NSURLConnection的异步请求或通过在后台线程上执行同步请求来完成此操作。如果你已经这样做了,我很抱歉重复它 - 只是认为我会快速提醒。 – Tim