gpt4 book ai didi

ios - Realm 错误 : RLMArray and Migration

转载 作者:行者123 更新时间:2023-11-28 07:03:03 25 4
gpt4 key购买 nike

我在尝试编译我的 Realm 代码时遇到了一些错误,这是代码的第一个版本:

import RealmSwift

class Test: Object {
dynamic var name = ""
dynamic var dict = Dictionary<String, Int>()
dynamic var owner: TestList?
}


class TestList: Object{
dynamic var name = ""
let tests = List<Test>().filter("ALL Test.dict[hello] != nil")
}

//ViewController

import RealmSwift

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
let realm = Realm()
let test1 = Test()
test1.name = "test1"
test1.dict = ["hello": 1]
realm.write{realm.add(test1)}
let test2 = Test()
test2.name = "test2"
test2.dict = ["nihao": 2]
realm.write{realm.add(test2)}

let test3 = Test()
test3.name = "test3"
test3.dict = ["hello": 3]
realm.write{realm.add(test3)}
}


@IBOutlet weak var label: UILabel!

@IBAction func set(sender: UIButton){
let test = Test()
let realm = Realm()
test.name = "not using CoreData"
realm.write{realm.add(test)}
text = "abc"
}

@IBAction func show(sender: UIButton){

let test = Realm().objects(TestList)
var str = ""
println("got to here")
for i in test{
str += " \(i.name)"
}
label.text = str
}
}

通过此设置,我在日志中收到一条错误消息:由于未捕获的异常“RLMException”而终止应用程序,原因:“此方法只能在从 RLMRealm 检索到的 RLMArray 实例上调用”

当我删除 TestList 对象中的过滤时,错误变为:Termating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'Test' due to the following errors:
- 属性“dict”已添加到最新的对象模型中。
- 属性 'owner' 已添加到最新的对象模型中。'

我对 Realm 文档的理解完全错误吗?

最佳答案

第一个错误是对的。您不能过滤属性。此外,Realm 目前不允许使用 Dictionary 属性。您需要将其显式建模为专用 Realm 对象实体的列表属性,该实体具有用于保存 StringInt 的字段。

class Test: Object {
dynamic var name = ""
dynamic var dict = List<TestRelatedThing>()
dynamic var owner: TestList?
}

class TestRelatedThing : Object {
dynamic var key: String
dynamic var value: Int
}

class TestList: Object{
dynamic var name = ""
let tests = List<Test>()
}

然后您可以在运行时通过以下方式查询:

Realm().objects(TestList).filter("ANY tests.key == %@", "hello")

提示:Realm 不支持聚合运算符ALL。查看我们的 predicate cheat sheet有关支持的运营商的完整列表。在这里,存在量化该操作在任何地方都更有意义,因为数据结构发生了变化,它不允许 TestRelatedThing 的条目及其 value 属性等于 nil 首先存在。因此,您只需确保有一个键为 "hello" 的条目即可。

对于第二个错误:我猜你之前尝试运行你的代码并在第一次运行之后向你的模型对象添加了更多字段。

您可以重置模拟器状态,或者可以只添加以下代码行之一,以确保在开发过程中每次运行时都从一个新的 Realm 开始。

# Swift 1.2
var error: NSError?
NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath, error:&error)

# Swift 2
try! NSFileManager.defaultManager().removeItemAtPath(Realm.defaultPath)

关于ios - Realm 错误 : RLMArray and Migration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com