使用默认值预加载核心数据表
Posted
技术标签:
【中文标题】使用默认值预加载核心数据表【英文标题】:Preload a core data table with default values 【发布时间】:2011-05-21 05:16:13 【问题描述】:我有一个带有多个表格的 OSX 核心数据应用程序(非基于文档)。我想在我的应用程序中只使用其中一个预加载数百条记录的表。用户还可以向预填表中添加更多记录。
将我的应用程序与预先填充的表格之一一起发布的最佳方式是什么?我在 ios 上看到过类似的答案,但我使用的是 OSX,它似乎没有使用 sqlite 作为核心数据。
应用程序的未来版本可能希望更新此表,而不清除使用当前版本创建的任何用户定义记录。
提前谢谢你。
【问题讨论】:
OS X 上的 Core Data 确实将 SQLite 作为可用的存储类型(事实上,它具有比 iOS 上可用的存储类型更多的选项)。请参阅核心数据编程指南中的"Persistent Store Features"。 【参考方案1】:我也有答案,不是说约书亚不正确。
我最近不得不这样做,正确的方法实际上取决于您希望预加载多少数据?
A)如果它很多,那么可以添加一个预先填充的商店并在开始时加载它
B) 如果不是,则只需通过代码手动添加数据
两者都有优点和缺点。 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 );
【讨论】:
【参考方案2】:将模板数据文件存储在应用程序的资源中。如果用户没有工作数据文件,请将模板复制到位。
【讨论】:
以上是关于使用默认值预加载核心数据表的主要内容,如果未能解决你的问题,请参考以下文章