2011-05-21 37 views
1

我有一个包含多个表的OSX核心数据应用程序(基于非文档)。我想用我的应用程序只有一个预装了几百条记录的表。用户还可以将更多记录添加到预填表中。使用默认值预加载核心数据表

什么是运送我的应用程序与预填充表之一的最佳方式是什么?我已经看到了iOS的类似答案,但是我在OSX上看起来并没有将核心数据用于sqlite。

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

预先感谢您。

+3

核心数据确实有SQLite作为一个可用的存储类型(事实上,它有存储类型多一个选择比用于iOS)。请参阅[“持久性商店功能”](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPersistentStores.html%23//apple_ref/doc/uid/TP40002875-SW1 )在核心数据编程指南。 – 2011-05-21 07:04:16

回答

0

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

3

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

我最近不得不这样做,正确的方法真的取决于您要预装多少数据?

A)如果这是一个很大,那么是添加预填充的存储和加载在开始

B)如果不是的话,那么就通过代码手动

添加数据两者都有Pro的和Con的。 A)最大的问题是,当你去更新你的模型时,你将不得不重新填充一个新的模板。对我而言,这可能是一场行政噩梦。

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

我推荐使用NSPersistentStoreCoordinator的类方法。这样您就不需要在您的上下文中执行另一次保存。

代码:OS X

#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); 
}