我正在阅读Tim Oliver撰写的这篇文章(Migrating an App from Core Data to Realm),我看到了以下段落,就我将应用程序从Core Data转换为Realm而言,这是我能够找到的最多指导:
"迁移到Realm后,您可以将Core Data框架重新链接到应用程序中,使用原始NSManagedObject对象从Core Data获取用户数据,然后手动将其传递给领域。您可以将此迁移代码永久保留在应用中,也可以在经过足够长的时间后将其删除。"
这似乎是一个好主意;但是,我甚至找不到应该如何做的一个例子。
我已将所有Core Data类更改为Realm,因此无法再使用它们。我有应用程序可用的xcdatamodel文件,核心数据框架很容易重新打开。我是否需要重新设置整个持久性存储控制器,managedObjectContext等?
虽然不受欢迎,但必要时可以这样做。然后我就会想出来,因为那是“原始的'需要使用NSManagedObject,如何正确捕获多对多和一对多关系及其反转。
有人能指出我正确的方向吗?我正在使用objective-c,但如果有任何要指出的话,将从Swift中的示例中受益。
答案 0 :(得分:3)
我是撰写该文章的Tim Oliver。 :)
所以在我自己的应用程序中(该文章所基于的),当我从Core Data迁移到Realm时,我做了一个干净的休息。我存储的所有数据都只是由应用程序中的文档文件派生的缓存元数据,所以我选择简单地删除磁盘上的Core Data SQLite文件,然后下次用户只会出现轻微的不便在重新计算元数据并将其存储在Realm中时打开了应用程序。
如果你的核心数据文件中有数据,那么繁重的就是执行从Core Data到Realm的一次性迁移。不建议直接从SQLite文件访问原始数据,因此唯一的方法是保留核心数据代码并使用它来查询和复制数据。
我对'raw NSManagedObject
s的意思是,由于Core Data对象符合KVC标准,如果您已经将模型类重构为Realm类,则可以直接从基础访问数据{ {1}}类使用KVC方法,例如NSManagedObject
。
我在one of the official Apple Core Data sample code projects中对此进行了简要测试,以确认它仍然有效。
最初,从Core Data -[NSObject valueForKey:]
对象访问数据如下所示:
Book
但是,一旦您将- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
// Configure the cell to show the book's title
Book *book = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = book.title;
}
课程重构为Book
,您仍然可以访问Core Data商店中的数据,如下所示:
RLMObject
通过这种方式,您仍然可以像以前一样访问Core Data对象中的数据,但您现在可以自由地使用Realm的实际类。
不幸的是,正如您在评论中提到的那样,这确实意味着您需要保留一定数量的核心数据代码,以便能够打开核心数据存储并从中获取数据。
但理想情况下,您应该能够将所有这些代码限制在单个“迁移器”类中,该类只需要在第一次检测到用户的数据尚未复制到Realm时运行。经过足够长的时间后,您可以考虑完全放弃它。