2015-07-22 67 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