使用默认值预加载核心数据表

时间:2011-05-21 05:16:13

标签: cocoa core-data default nsarraycontroller preload

我有一个OSX核心数据应用程序(非基于文档),有几个表。我想发布我的应用程序,其中只有一个表预装了几百条记录。用户还可以在预填表中添加更多记录。

使用其中一个预先填好的表格发送我的应用的最佳方式是什么?我已经看过iOS的类似答案,但我在OSX上似乎没有使用sqlite作为核心数据。

应用程序的未来版本可能希望更新此表而不会消除使用当前版本创建的任何用户定义的记录。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

我也有答案,不是说约书亚不正确。 < - 他......双重否定。

我最近不得不这样做,正确的方法实际上取决于您希望预加载多少数据?

A)如果它很多,那么添加预先填充的商店并在开始时加载

B)如果不是,那么只需手动通过代码添加数据

两者都有Pro和Con。 A)的最大问题是,当您更新模型时,您将不得不重新填充新模板。对我来说,这可能是一场行政噩梦。

所以接下来你可能想知道如何判断何时做A)或B)?答案在持久性商店的元数据中。你真的应该只有一个商店,所以让我们假设是这样的。我所做的只是获取“商店”的元数据,如果我的dict对象没有返回YES,那么填充我的表。如果保存成功,则使用NSNumber BOOL值为YES更新“商店”的元数据。

我建议使用NSPersistentStoreCoordinator的类方法。这样,您无需在上下文中执行其他保存。

代码:

#pragma mark - Core Data Meta Data:

- (NSDictionary *) persistentStoreMetaData {

    if ( ![_coreDataStore isExists] )
        return [NSDictionary dictionary];

    NSError * error = nil;
    NSDictionary * dict = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType 
                                                                                     URL:_coreDataStore 
                                                                                   error:&error];
    if ( error ) {
        REPORT( errReportErrErrorStoreMetaDataGet );
        return [NSDictionary dictionary];
    }

    return dict;
}

- (void) setPersistentStoreMetaData:(NSDictionary *)metaData {

    if ( ![_coreDataStore isExists] ) return;

    NSError * error = nil;
    [NSPersistentStoreCoordinator setMetadata:metaData 
                     forPersistentStoreOfType:NSSQLiteStoreType 
                                          URL:_coreDataStore 
                                        error:&error];
    if ( error ) 
        REPORT( errReportErrErrorStoreMetaDataSave );
}

答案 1 :(得分:0)

将模板数据文件存储在应用程序的资源中。如果用户没有工作数据文件,请将模板复制到位。