32632


いろいろ調べてみたのですが，Listという物がどういう物なのか，その扱い方がわかりません。

RealmのDBには，subDataTableに複数のDayが 登録され，思うとおりに登録されているのですが，データの取り出し方がわかりません。

[code]

    "List<subDataTable> (\n\t[0] subDataTable {\n\t\tID = 0;\n\t\tDay = 2017-02-12 11:16:20 +0000;\n\t},\n\t[1] subDataTable {\n\t\tID = 1;\n\t\tDay = 2017-02-12 11:16:20 +0000;\n\t}\n)",
    "List<subDataTable> (\n\t[0] subDataTable {\n\t\tID = 0;\n\t\tDay = 2017-02-12 11:16:20 +0000;\n\t},\n\t[1] subDataTable {\n\t\tID = 1;\n\t\tDay = 2017-02-12 11:16:20 +0000;\n\t}\n)")
    
[/code]

取り出そうとすると、上記の様になってしまいます。

これを配列などで

[code]

    ID=0
    Day=2017-02-12 11:16:20 +0000
    
[/code]

として取り出したいのです。

どうしたら良いのか，ご教授いただけないでしょうか。

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

[code]

    import Foundation
    import RealmSwift
    
    //メインデータ
    class mainDataTable: Object {
        dynamic var ID = Date(timeIntervalSince1970: 1)
        let Days = List<subDataTable>()
        dynamic var Title = String()
        dynamic var Category : categoryDataTable?
        dynamic var Memo = String()
        dynamic var Notification = false
    }
    
    //日付データ
    class subDataTable: Object {
        dynamic var ID = Int()
        dynamic var Day = Date(timeIntervalSince1970: 1)
    }
    
    //カテゴリ名
    class categoryDataTable: Object {
        //dynamic var ID = Int()
        dynamic var CategoryName = String()
        override static func primaryKey() -> String? {
            return "CategoryName"
        }
    }
    
    class RealmConnect{
        //デフォルトRealmの取得
        let realm = try!Realm()
        //データ
        var mainData = mainDataTable()
    
        func dataSave(){
    
            // 現在の日時を取得
            let now = Date()
            //タイムゾーンの設定必要？
    
            let subData1 = subDataTable()
            subData1.ID = 0
            subData1.Day = now as Date
            let subData2 = subDataTable()
            subData2.ID = 1
            subData2.Day = now as Date
            //とりあえずのデータを2件つくって放り込む（Daysも2件のもの）
            mainData.ID = now as Date
            mainData.Days.append(subData1)
            mainData.Days.append(subData2)
            mainData.Title = "てすと１"
            mainData.Category?.CategoryName = "test"
            mainData.Memo = "Memo1"
            mainData.Notification = true
    
            //オブジェクトをRealmに追加する
            realm.beginWrite()
            realm.add(mainData)
            try! realm.commitWrite()
    
            let user = realm.objects(mainDataTable.self).sorted(byKeyPath: "ID", ascending: true)
    
            //ここでListの内容を　一件ずつ 取得したいがListの扱い方がわからない
            print(user.count)
            print(user[0])
            let userDays = [user.value(forKeyPath: "Days")!]
            print(userDays.count)
    
            print(userDays[0])
            for element in userDays {
                print(element)
            }
            print(user.count)   
        }
    }
    
[/code]


CC BY-SA 3.0
2017-02-12T11:32:53.987
32603
2017-02-13T10:05:06.390
2017-02-12T23:55:30.390
10845
10845
question
swift realm
Swift3でRealmを使用しListを使いたいが，Listの扱いがわからない


まずこの部分が間違っています。

[code]

    let userDays = [user.value(forKeyPath: "Days")!]
    
[/code]

`value(forKeyPath:)`メソッドが必要になることはあまりないので、まだ初心者の今の段階ではこのメソッドのことは忘れましょう。

また、右辺をわざわざ`[]`で囲ってしまっているので、戻り値が配列になってしまっています。それも意図しない結果になっている原因です。

まず、次の段階で`user`には`Results`という型の変数に結果が格納されています。

[code]

    let user = realm.objects(mainDataTable.self).sorted(byKeyPath: "ID", ascending: true)
    
[/code]

たとえ１件しかない、あるいは1件も結果がないとしても、等しく`Results`型の変数に格納されています。

次の行で、`user[0]`としているように、`Results`から`mainDataTable`の要素をまず取得する必要があります。  
`user[0]`のように添え字を使う方法の他に`for u in user`のようにループを使う方法などがあります。

`let u =
user[0]`のように`Results`から要素を取り出したら、`mainDataTable`のプロパティに直接アクセスできます。例えば次のような形です。

[code]

    let u = user[0]
    let day = u.days[0]
    ...
    
[/code]

あるいは、

[code]

    let u = user[0]
    for day in u.days {
        ...
    }
    
[/code]

とします。


CC BY-SA 3.0
2017-02-13T10:05:06.390
32632
2017-02-13T10:05:06.390
5519
32603
answer