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

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】:

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

【讨论】:

以上是关于使用默认值预加载核心数据表的主要内容,如果未能解决你的问题,请参考以下文章

预加载信息的核心数据

带有核心数据的预加载数据库

如何使用 JSON 预加载一对多核心数据关系

如何使用 swift 3 xcode 8 在核心数据中预加载数据库

预加载具有多对多关系的核心数据的最佳实践

在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单