是否可以保存NSManagedObjectModel?

时间:2014-03-26 00:29:58

标签: ios sqlite core-data

我有以下要求:使用.xml文件中的数据创建和填充SQLite数据库,此文件可以随时具有不同的结构,因此我无法使用Xcode创建NSManagedObjectModel,它必须在运行时。我已成功地以编程方式创建了NSManagedObjectModel,创建了持久性存储,并使用.xml中的数据填充了sqlite文件。但是,下次我使用该应用程序时,持久性存储与NSManagedObjectModel不兼容(我不想在每次运行应用程序时重新创建模型,这是第一次)。有没有办法保存我以编程方式创建的模型并在下次需要时加载它?我在示例中看到的只是从NSBundle加载的模型。

2 个答案:

答案 0 :(得分:4)

  

有没有办法保存我以编程方式创建的模型并在下次需要时加载它?

是。 NSManagedObjectModel符合NSCoding,这意味着您可以轻松地将其转换为NSData,也可以轻松保存和阅读NSData

保存模型:

NSString *modelPath = // path where you want to save
NSData *modelData = [NSKeyedArchiver archivedDataWithRootObject:self.managedObjectModel];
[modelData writeToFile:modelPath atomically:YES];

要阅读已保存的模型:

if ([[NSFileManager defaultManager] fileExistsAtPath:modelPath]) {
    NSData *savedModelData = [NSData dataWithContentsOfFile:modelPath];
    NSManagedObjectModel *savedModel = [NSKeyedUnarchiver unarchiveObjectWithData:savedModelData];
}

答案 1 :(得分:0)

我不确定您是否说xml文件中的数据每次都在变化。听起来你指的是数据,而不是数据模型。我不能具体回答,但我会采取如下方法。

如果xml文件中的数据每次构造相同或接近相同,我会创建一个与之匹配的数据模型。

然后我会写一些解析xml的解析器类,并根据你" ManagedObjectModel"将其解析到Core Data数据存储中。或数据模型。

当您在Core Data之外更改数据存储区时,我已经看到了您正在讨论的错误。您需要让Core Data处理所有读取和写入数据存储,否则Core Data将告诉您基本上#34;您的持久存储是由ManagedObjectModel"以外的其他东西创建或更改的。我认为这就是正在发生的事情。

我知道我并没有完全按照核心数据的说法使用这个术语,但核心数据令人困惑,我试图传达信息和理解。

我也会考虑使用MagicalRecord。 彻底使核心数据更易于使用,www.raywenderlich.com上有一个很棒的教程,您可以找到Here

我真的希望这可以帮助你解决一些问题。如果没有,请发布一些示例代码或可能是您所指的xml的示例。

祝你好运