8790


データベースの行を削除しようとすると、`realm.deleteObject`の行で「`'RLMResults' is not convertible to
'RLMObject'`」というエラーが表示されてしまいます。色々調べてみてもあまり`Realm`の使い方が載ったサイトを見つけることができません。初歩的なことだと思いますが、どうすればデータを削除することができるでしょうか？  
また、テーブルを丸ごと削除するにはどうすればいいでしょうか？  
どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

[code]

    import Foundation
    
    class Word: RLMObject {
        var id = 0
        var speech = ""
        var word = ""
    
        override class func primaryKey() -> String {
            return "id"
        }
    }
    
[/code]

データの削除処理

[code]

    let realm = RLMRealm.defaultRealm()
    realm.transactionWithBlock({ () -> Void in
        realm.deleteObject(Word.objectsWhere("id == 1"))
    })
    
[/code]

---追記---

「`deleteObject`」を「`deleteObjects`」に変えて試したところエラーがなくなりコンパイルができるようになりました。しかし、いざプログラムを実行してみるとプログラムが動かなくなってしまいました。その後色々試してみて`Word.objectsWhere("speech
==
A")`とするとプログラムが正常に動き、データも削除することができました。これはどういうことなのでしょうか？なぜidを指定して削除できないのでしょうか？

---追記---
[code]

    import Foundation
    
    class Word: RLMObject {
        dynamic var id = 0
        dynamic var speech = ""
        dynamic var word = ""
    
        override class func primaryKey() -> String {
            return "id"
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        let realm = RLMRealm.defaultRealm()
        realm.transactionWithBlock({ () -> Void in
            realm.deleteObjects(Word.allObjects())
        })
    }
    
[/code]


CC BY-SA 3.0
2015-04-05T06:29:26.813
8782
2015-04-06T13:00:02.237
2015-04-06T13:00:02.237
5210
5210
question
swift realm
'RLMResults' is not convertible to 'RLMObject'


`deleteObject`ではなくて`deleteObjects`が正しいのではないでしょうか。


CC BY-SA 3.0
2015-04-05T06:44:19.363
8783
2015-04-05T06:44:19.363
5750
8782
answer


### データの削除について

> どうすればデータを削除することができるでしょうか？

下記のコードも、`Word.objectsWhere("speech ==
A")`としたコードも私が試した限りではどちらも正しく動いていますが、「プログラムが動かなくなってしまいました。」というのは具体的にはどのようなことが起こっているのでしょうか？  
コード全体を提示したり、もう少し詳しい状況を教えていただくことはできますか？

[code]

    let realm = RLMRealm.defaultRealm()
    realm.transactionWithBlock({ () -> Void in
        realm.deleteObject(Word.objectsWhere("id == 1"))
    })
    
[/code]

また、「idを指定して削除」は、プライマリキーを指定して削除したいということだと思いますので、まず、プライマリキーを指定してオブジェクトを取得するのは次のように書けます。

[code]

    Word(forPrimaryKey: 1)
    
[/code]

これはプライマリキーを指定しているので、RLMResultsではなく、Wordオブジェクト（もしくはnil）が返ってくるので、`deleteObject`メソッドに渡すことができます。

この方がプライマリキーを指定して１件削除をする、という処理としてはわかりやすい書き方かと思います。

[code]

    let realm = RLMRealm.defaultRealm()
    realm.transactionWithBlock({ () -> Void in
        realm.deleteObject(Word(forPrimaryKey: 1))
    })
    
[/code]

### 任意のテーブルのデータをすべて削除するには

> テーブルを丸ごと削除するにはどうすればいいでしょうか？

テーブルを丸ごと削除するには次のように書きます。  
対象のモデルのデータをすべて取得して、`deleteObjects`メソッドに渡します。

[code]

    let realm = RLMRealm.defaultRealm()
    realm.transactionWithBlock { () -> Void in
        realm.deleteObjects(Word.allObjects())
    }
    
[/code]

実際にテーブルのデータ全件がロードされるわけではありませんので、この処理はとても高速に動作します。


CC BY-SA 3.0
2015-04-05T12:31:17.830
8790
2015-04-05T12:31:17.830
5519
8782
answer