核心数据:使用Image预填充SQLite实体

时间:2011-07-05 21:38:46

标签: iphone image sqlite core-data populate

我已经预先为我的应用程序填充数据,首先通过核心数据创建数据库,然后使用SQLite Manager填充该初始化文件。是否可以在SQLite表中预先填充图像以用于核心数据?

我最初的想法是通过SQLite Manager将图像作为blob插入。然后基于此post,看起来我需要将类型设置为二进制并使用UIImage initWithData:导入。

这是可行的,如果是,这是适当的方法吗?

2 个答案:

答案 0 :(得分:2)

将图像预先填充到SQLite数据库以供Core Data使用,结果相当简单。

  1. 首先配置您的Core Data应用程序,实现您的属性以将图像包含为“二进制”类型。构建应用程序并使用应用程序模拟器中的Core Data导航到您的视图。这将根据需要初始化SQLite数据库以与Core Data一起使用(假设您已按如下方式实现了persistentStoreCoordinator)。
  2. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
        if (persistentStoreCoordinator != nil) {
            return persistentStoreCoordinator;
        }
        NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"YourDBName.sqlite"];
    
        // Set up the store.
        // For the sake of illustration, provide a pre-populated default store.
    
        NSFileManager *fileManager = [NSFileManager defaultManager];
        // If the expected store doesn’t exist, copy the default store.
        if (![fileManager fileExistsAtPath:storePath]) {
            NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"YourDBName" ofType:@"sqlite"];
            if (defaultStorePath) {
                [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
            }
        }
    
        NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                                 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
                                 nil];
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    
        NSError *error;
        if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }
        return persistentStoreCoordinator;
    }
    
    1. 导航到“Users // Library / Application Support / iPhone Simulator / User / Applications /”中的应用程序数据。如果您按“修改日期”对文件夹进行排序,您的应用程序将具有最新日期(假设您没有同时构建任何其他应用程序)。输入应用程序文件夹并初始化< YourDBName.sqlite>将驻留在Documents文件夹中。将SQLite数据库复制到另一个位置(如桌面)并删除原始文件(这是允许Core Data重新加载您即将创建的预先填充的SQLite数据库所必需的。)

    2. 打开< YourDBName.sqlite>使用您最喜欢的SQLite编辑器(Firefox的SQLite Manager插件是一个适当且免费的选项)。在表格中添加条目,将任何图像作为“BLOB”插入。

    3. 在XCode中添加< YourDBName.sqlite>作为现有文件。核心数据会在您下次启动应用程序时将此文件复制到应用程序数据文件夹(如果该应用程序尚不存在)(您删除了原始文件?)。

    4. 使用[UIImage imageWithData:< DataObject >.< ImageAttributeName >

    5. 访问代码中预先填充的图片

答案 1 :(得分:1)

你的影像有多大?如果它们相当大,则可以通过将图像存储在文件系统中并保持对其在核心数据中的位置的引用来提供更好的服务。

如果图片将始终存在于您的应用中,那么您可以将其打包并捆绑。如果不是(例如,用户可以删除不需要的图像),您可能不得不依赖于在首次使用时拉入图像。