14433


Realmを勉強中です。

サンプルやマニュアルを見ているのですが、いまいちわからず・・・

ID 読み 登録データ Time  
1 かお (^^) 2010-01-01 00:00:00  
2 かお (^^; 2010-01-01 00:00:01

上記データで、Timeでソートしながら「か」で「(^^)」と「(^^;」などのデータを読みだしたいのです。

下記コードはリスト化とソートがわからずに書いています。

そして、使った行のTimeだけ現在時刻で更新したいのです。

わかる方、教えていただけたら幸いです。

よろしくお願いいたします。

[code]

    import UIKit
    import Foundation
    import RealmSwift
    extension String : CollectionType {}
    
    class dic: Object {
        dynamic var ID = 0
        dynamic var yomi = ""
        dynamic var emoji = ""
        dynamic var date = NSDate(timeIntervalSince1970: 1)
    
        override static func primaryKey() -> String? {
            return "ID"
        }
    }
    
    class KeyboardViewController: UIInputViewController {
        var DBdir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    
    ・・・
    
        override func viewDidLoad() {
            super.viewDidLoad()
        ・・・
        }
    
    ・・・
    
        func btnDown11(sender: UIButton){
            self.button11.backgroundColor = UIColor.blackColor()
        }
        func btnUp11(sender: AnyObject){
            self.button11.backgroundColor = UIColor.whiteColor()
                tText = "か"
                InsertText(tText)
         }
    
         func btnDownEnter(sender: UIButton){
            self.buttonEnter.backgroundColor = UIColor.blackColor()
         }
    
        func btnUpEnter(sender: UIButton){
             self.buttonEnter.backgroundColor = UIColor(red: 0.1, green: 0.5, blue: 0.7, alpha: 1.0)
             let proxy = textDocumentProxy
             proxy.insertText("\n")
             //この辺で唯一の使ったデータの日時更新
            dic.date = dateFormatter.dateFromString("2014-01-01 00:00:03")!; //日時後日固定でなく自動取得に変更
            do {
                let realm = try Realm(path: realmPath)
    
                realm.write {
                    realm.add(dic)
               }
            } catch {
                print("error")
            }
    
        }
    
    
        ・・・
    
        func InsertText (str: String){
            tText = ""
            //この辺で変換「リスト」の取得
            // Query using a predicate string
            var tanDic = dic.objectsWhere("color = 'str' AND name BEGINSWITH 'B'")
    
            // Query using an NSPredicate object
            let predicate = NSPredicate(format: "読み = %@ AND name BEGINSWITH %@", str, "B")
            tanDic = Dog.objectsWithPredicate(predicate)
            //ここでリスト表示            
            print(tanDic)
    
            let proxy = textDocumentProxy
            proxy.insertText(str)
         }
    
    }
    
[/code]


CC BY-SA 3.0
2015-08-14T09:30:30.340
14418
2015-08-14T16:49:04.420
2015-08-14T13:39:50.053
10845
10845
question
swift realm
Swift2でRealmのデータを読み出したい。


だいたい何をやろうとされてるのか理解しました。

ボタンから入力された文字を受け取って、データベースからその文字で始まるデータを変換候補として表示して、選択された候補については`date`を更新して次からは先頭に表示されるようにしたい、とかそんな感じでしょうか。

そうだとすると、まずモデルの定義は間違ってはいませんが、少し修正したほうがいいです。  
クラス名は大文字で始めるようにしましょう。  
これはアップルが使用しているルールなので、それに合わせるほうが読みやすくなります。

また、`date`プロパティの初期値は現在時刻のほうがいいでしょう。  
なぜなら、選択された変換候補が先頭に来るように並べ替えるのであれば、初期値が現在時刻のほうが都合が良いからです。

そうするとモデルクラスは下記のようになります。

[code]

    class Dic: Object {
        dynamic var ID = 0
        dynamic var yomi = ""
        dynamic var emoji = ""
        dynamic var date = NSDate()
    
        override static func primaryKey() -> String? {
            return "ID"
        }
    }
    
[/code]

変換候補として表示するデータはあらかじめ保存されている必要がありますので、顔文字のデータを保存しましょう。  
ご提示の顔文字のデータを２件挿入するコードは下記のようになります。

[code]

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let dic1 = Dic()
        dic1.ID = 1
        dic1.yomi = "かお"
        dic1.emoji = "(^^)"
    
        let dic2 = Dic()
        dic2.ID = 2
        dic2.yomi = "かお"
        dic2.emoji = "(^^;"
    
        let realm = try! Realm()
        realm.write { () in
            realm.add(dic1, update: true)
            realm.add(dic2, update: true)
        }
    }
    
[/code]

次に、入力された文字から始まる変換候補を検索する例は下記になります。  
とりあえず、入力された文字は固定で"か"ということにします。

`yomi`プロパティが`inputText`で始まるデータを検索し、`date`プロパティの降順に並べ替えています。

お分かりかと思いますが、`inputText`変数に違う文字が入れば、異なる結果になります。

[code]

    let inputText = "か"
    let results = realm.objects(Dic)
        .filter("yomi BEGINSWITH %@", inputText)
        .sorted("date", ascending: false)
    
[/code]

これで、`results`に変換候補としての検索結果が入っているので、取り出すには下記のようにします。

ループで取り出す以外にも、`results[0]`や`results[1]`などとして、１件目、２件目を取り出すこともできます。

[code]

    for result in results {
        print(result)
    
        let realm = try! Realm()
        realm.write { () in
            result.date = NSDate()
        }
    }
    
[/code]

そして、上記のコードではループして取り出した`Dic`オブジェクトの`date`プロパティを現在時刻で更新しています。  
これを応用すると、選択された変換候補は次の検索から先頭に表示される、ということが実現できると思います。


CC BY-SA 3.0
2015-08-14T16:49:04.420
14433
2015-08-14T16:49:04.420
5519
14418
answer