2017-02-15 2 views
0

Ich habe zwei ModellklasseSwift 3 Benötigen Auf Realm Abfrage Hilfe

class EntryModel: Object { 
    dynamic var id: Int = 0 
    dynamic var type: String = "" 
    dynamic var tap: Int = 0 
    dynamic var title: String = "" 
    dynamic var notes: String = "" 
    dynamic var startTime: Date? = nil 
    dynamic var endTime: Date? = nil 
    dynamic var amount1: Int = 0 
    dynamic var amount2: Int = 0 
    dynamic var meal: String = "" 
    dynamic var foodDetails: String = "" 
    dynamic var isAlarm: Bool = false 
    dynamic var timeOfAlarm: Date? = nil 
    //dynamic var lastFeedTime: Date? = nil // optionals supported 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

und

class EntryModelList: Object { 
    dynamic var id: Int = 0 
    dynamic var babyId: Int = 0 
    dynamic var date: Date? = nil 
    var entryModel = List<EntryModel>() 
    //dynamic var lastFeedTime: Date? = nil // optionals supported 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

: Ich bin in Reich, damit ich weiß nicht viel über sie. Ich möchte eine Abfrage, die mich zurückgibt, indem ich mit babyId der EntryModelList und dem Typ von EntryModel filtere. Das wird nur diese Liste übereinstimmen, die ich möchte.

Ich habe versucht, mit

let predicate = NSPredicate(format: "babyId == \(babyId) AND ANY entryModel.type IN %@", filterArray) 
let entryModelList = try! Realm().objects(EntryModelList.self).filter(predicate).sorted(byKeyPath: "date", ascending: false) 

Prädikat Ausgang:

babyId == 1 AND ANY entryModelList.type IN {"breast", "bottle"} 

Ausgang:

Results<EntryModelList> (
    [0] EntryModelList { 
     id = 2; 
     babyId = 1; 
     date = 2017-02-16 18:00:00 +0000; 
     entryModelList = RLMArray <0x6100000ff480> (
      [0] EntryModel { 
       id = 8; 
       type = diaper; 
       tap = 1; 
       title = ; 
       notes = ; 
       startTime = 2017-02-17 11:26:36 +0000; 
       endTime = (null); 
       amount1 = 0; 
       amount2 = 0; 
       meal = ; 
       foodDetails = ; 
       isAlarm = 0; 
       timeOfAlarm = (null); 
      }, 
      [1] EntryModel { 
       id = 10; 
       type = bottle; 
       tap = 1; 
       title = ; 
       notes = Fgdg; 
       startTime = 2017-02-16 23:44:22 +0000; 
       endTime = (null); 
       amount1 = 15; 
       amount2 = 0; 
       meal = ; 
       foodDetails = ; 
       isAlarm = 0; 
       timeOfAlarm = (null); 
      } 
     ); 
    }, 
    [1] EntryModelList { 
     id = 1; 
     babyId = 1; 
     date = 2017-02-14 18:00:00 +0000; 
     entryModelList = RLMArray <0x6100000fd680> (
      [0] EntryModel { 
       id = 1; 
       type = breast; 
       tap = 0; 
       title = ; 
       notes = ;'l'k,; 
       startTime = 2017-02-14 23:15:49 +0000; 
       endTime = (null); 
       amount1 = 100; 
       amount2 = 0; 
       meal = ; 
       foodDetails = ; 
       isAlarm = 0; 
       timeOfAlarm = (null); 
      }, 
      [1] EntryModel { 
       id = 4; 
       type = bottle; 
       tap = 0; 
       title = ; 
       notes = Jhkhjkhjk; 
       startTime = 2017-02-15 01:17:47 +0000; 
       endTime = (null); 
       amount1 = 100; 
       amount2 = 0; 
       meal = ; 
       foodDetails = ; 
       isAlarm = 0; 
       timeOfAlarm = (null); 
      }, 
      [2] EntryModel { 
       id = 7; 
       type = breast; 
       tap = 0; 
       title = ; 
       notes = ; 
       startTime = 2017-02-15 11:43:08 +0000; 
       endTime = (null); 
       amount1 = 100; 
       amount2 = 0; 
       meal = ; 
       foodDetails = ; 
       isAlarm = 0; 
       timeOfAlarm = (null); 
      } 
     ); 
    } 
) 

aber das ist nicht das, was ich will. Ich möchte wissen, wie ich nur die Datenliste bekommen werde, wo EntryModel.type "Brust" oder "Flasche" Typ ist.

Danke.

+0

Können Sie einige Beispiele liefern Daten zeigen, was Sie Ihre Abfrage im Vergleich zu dem, was es tatsächlich übereinstimmt übereinstimmen soll? Aus Ihrer Beschreibung ist schwer zu verstehen, was die Abfrage anders machen soll. – bdash

+0

@bdash Ich habe meine Frage aktualisiert und bitte lassen Sie mich wissen, dass Sie meine Frage verstehen können oder nicht. Mein Englisch ist nicht so gut. Wenn du mir eine Lösung geben kannst, werde ich dir gegenüber demütig sein. Danke – Jihan

+0

Willst du mit einem 'Results 'enden, in dem jede' EntryModelList' -Eigenschaft' EntryModelList' gefiltert ist, so dass sie nur Objekte mit der entsprechenden 'type' Eigenschaft enthält? – bdash

Antwort

1

Results.filter(_:) ermöglicht nur das Filtern, welche Objekte des angegebenen Typs in der Ergebnismenge enthalten sind. Es unterstützt nicht das Filtern, welche Objekte in den Werten der Eigenschaften dieser Objekte enthalten sind.

zu tun, was Sie, nachdem Sie filter(_:) auf jedem der entryModelList Eigenschaften der Objekte verwenden, müssen Sie mit arbeiten schließen denjenigen nur Sie interessiert sind.