- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的 iOS 项目中使用了一个“通用”库。这个库创建了一个 Realm 数据库。到目前为止,我一直只在 iOS 项目上使用这个库。我现在想在 macOS 项目中使用同一个库。它基于 Foundation
,不使用 UIKit
,为什么不呢?
问题是:我有一个名为 Collection
Collection
也是标准 Swift 协议(protocol)的名称。
虽然我已经能够在我的 iOS 项目上避免这种名称冲突,但出于某种原因,我无法在我的 MacOS 项目上做同样的事情——它创建了一个名称集合。
我读到了可以像这样使用的符号:
@objc(SpecialCollection)
class Collection: Realm.Object {
let items: List<ItemObject>
let name: String
let url: String
....
}
因此,这解决了名称冲突问题。在 ObjC 中,名称会有所不同,但在 Swift 中,我不需要更改任何内容。
这一切都很好,除了我的本地 Realm 数据库。我有很多 Collection
对象应该重命名为 SpecialCollection
(因为 Realm 在 Swift 下使用 ObjC)。我想执行迁移来执行此操作,但显然还没有支持的方法来执行此操作?我注意到 github 上关于这个问题的票正在被“关注”,但不幸的是,仍然没有解决这个问题的已发布解决方案。
我所有的 Collection
对象都包含 List
对象(因此得名)。因此,我尝试对迁移中的所有 Collection
对象运行枚举...我只需要旧对象,并使用新名称创建一个新对象,如下所示:
migration.enumerateObjects(ofType: "Collection", { (oldObject, _) in
migration.create("SpecialCollection", value: oldObject)
}
但是由于 oldObject
有一个其他对象的列表,Realm 的迁移将尝试创建任何 List
对象中的所有项目......这是不可能的,因为它创建了具有相同 primaryKey
值的对象(导致崩溃)。
因此,我不能保留旧名称(Collection),也不能转换为新名称,并且我不能只是丢弃用户的数据。所以,我真的陷入了僵局。
block 引用
我尝试在创建新对象之前修改 oldObject
,但您不能在迁移中更改 oldObject
。
唯一的规则是必须保留旧数据,我不能在这里破坏用户的 Realm 。
在此感谢您的帮助。非常感谢。
最佳答案
昨晚我遇到了一个非常相似的问题。我有几个想要重命名的 Realm 类,其中一个类有一个引用第二个类的 List 属性。因此,与您的问题相比,唯一的区别是我也重命名了 ItemObject 类。
我是这样做的:
migration.enumerateObjects(ofType: "Collection")
{ (oldObject, newObject) in
let specialCollection = migration.create(SpecialCollection.className())
specialCollection["name"] = oldObject!["name"]
specialCollection["url"] = oldObject!["url"]
if let oldItems = oldObject!["items"] as? List<MigrationObject>,
let newItems = specialCollection["items"] as? List<MigrationObject>
{
for oldItem in oldItems
{
let newItem = migration.create(SpecialItemObject.className())
newItem["name"] = oldItem["name"] // You didn't specify what was in your ItemObject so this example just assumes a name property.
newItems.append(newItem)
migration.delete(oldItem)
}
}
}
migration.deleteData(forType: "Collection")
// Now migrate any remaining ItemObject objects that were not part of a Collection.
migration.enumerateObjects(ofType: "ItemObject")
{ (oldObject, newObject) in
let newItem = migration.create(SpecialItemObject.className())
newItem["name"] = oldItem["name"]
}
// Now let's be sure we'll have no further ItemObject in our entire Realm.
migration.deleteData(forType: "ItemObject")
这就是我昨晚自己解决这个问题的方法,在 GitHub 或 SO 或其他地方的 cocoa-realm 中几乎没有发现其中的大部分内容。上面的示例与您所要求的唯一不同之处在于您没有要求重命名您的 ItemObject 类。您可以尝试创建新的 ItemObject 对象并按照我在示例中显示的相同方式映射属性。我不明白为什么它不起作用。我已经准确地提供了我如何解决我自己的问题的示例,因为我昨晚测试了一些迁移以证明它是可靠的。
由于您的问题已经提出将近 5 个月了,我真的只是为了后代而发布这个答案。希望这对某人有帮助!
在 iOS 11.3 sim/Xcode 9.3/Swift 4.1 上使用 Realm 3.3.2 测试
关于ios - 在 Realm swift 中重命名类的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47914361/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!