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