2015-07-22 25 views
1

我遇到了一些错误,当我试图编译我的境界代码,这是代码的第一个版本:境界错误:RLMArray和迁移

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 
    } 
} 

在此设置下我得到一个错误我日志,上面写着: Terminating app due to uncaught exception 'RLMException', reason: 'This method can only be called on RLMArray instances retrieved from an RLMRealm'

当我删除了我的TestList对象的筛选,错误变成了:Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'Test' due to the following errors: - Property 'dict' has been added to latest object model. - Property 'owner' has been added to latest object model.'

难道我理解的领域的文档完全错了吗?

回答

1

第一个错误是正确的。您无法过滤属性。此外,Realm目前不允许使用字典属性。您需要明确地将其建模为专用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") 

提示:骨料操作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) 
+0

非常感谢您的详细解答!我能够解决几乎所有的错误,但我不完全理解最后一个错误的解决方法,似乎如果我不从一个新的Realm开始,每次调用它时查询结果都会建立起来。所以我最终每次运行程序时都会得到一组结果。 – Liumx31

+0

是的,这是正确的。如果你没有从一个全新的Realm开始,那么你的查询结果在每次运行后都会包含一个结果,因为你在视图控制器的viewDidLoad方法中添加了对象。这些更改**持续**。毕竟,这就是你使用Realm的原因,对吧? ;) – marius