将数据从 Core Data 迁移到 Realm 的步骤?

Steps to take in migrating data from Core Data to Realm?

我正在阅读 Tim Oliver (Migrating an App from Core Data to Realm) 的这篇文章,我看到了以下段落,这是我能找到的将我的应用程序从 Core Data 转换为领域:

"Once you’ve migrated to Realm, you can re-link the Core Data framework back into your app, use raw NSManagedObject objects to fetch your users’ data from Core Data, and then manually pass it over to Realm. You can leave this migration code in your app permanently, or simply remove it after a sufficient period of time has passed."

这似乎是个好主意;然而,我什至找不到一个例子来说明如何做到这一点。

我已经将我所有的 Core Data 类 都改成了 Realm,所以它们不能再使用了。我有应用程序可用的 xcdatamodel 文件,核心数据框架很容易重新打开。我是否需要重新设置整个持久存储控制器、managedObjectContext 等?

虽然不受欢迎,但必要时可以这样做。然后我要弄清楚,鉴于需要使用 'raw' NSManagedObject,如何正确捕获多对多和一对多关系及其逆关系。

任何人都可以指出我正确的方向吗?我正在使用 objective-c,但如果有任何要指出的内容,我会从 Swift 中的示例中受益。

我就是写那篇文章的蒂姆奥利弗。 :)

因此,在我自己的应用程序(该文章基于该应用程序)中,当我从 Core Data 迁移到 Realm 时,我做了一个彻底的突破。我存储的所有数据只是应用程序中文档文件派生的缓存元数据,所以我选择简单地删除磁盘上的 Core Data SQLite 文件,这样下次用户使用时只会带来轻微的不便打开应用程序,因为元数据被重新计算并存储在 Realm 中。

如果您的 Core Data 文件中有数据,那么执行从 Core Data 到 Realm 的一次性迁移是您的重任。不建议直接从 SQLite 文件访问原始数据,所以唯一的方法是保留您的 Core Data 代码并使用它来查询和复制数据。

我所说的 'raw NSManagedObjects' 的意思是因为核心数据对象是 KVC 兼容的,如果你已经将你的模型 classes 重构到 Realm classes 中,你可以使用 -[NSObject valueForKey:].

等 KVC 方法直接从基础 NSManagedObject class 访问数据

我在 one of the official Apple Core Data sample code projects 中对此进行了简短测试,以确认它仍然有效。

最初,从 Core Data 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 class 重构为 RLMObject,您仍然可以像这样从您的 Core Data 存储访问数据:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    // Configure the cell to show the book's title
    NSManagedObject *book = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [book valueForKey:@"title"];
}

通过这种方式,您应该仍然可以像以前一样访问 Core Data 对象中的数据,但您现在可以自由使用 Realm 的实际 classes。

不幸的是,就像您在评论中提到的那样,这确实意味着您需要保留一些核心数据代码,以便能够打开核心数据存储并从中获取数据。

但理想情况下,您应该能够将所有这些代码限制在一个 'migrator' class 中,只需要 运行 它第一次检测到用户的数据没有尚未复制到 Realm。在经过足够长的时间后,您可以考虑完全放弃它。