2017-02-15 16 views
0

У меня есть два класса моделиSwift 3 Нужна помощь по Realm Query

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" 
    } 
} 

и

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" 
    } 
} 

Я новичок в области, так что я не знаю много о нем. Я хочу запрос, который вернет меня, фильтруя с помощью babyId из EntryModelList и типа EntryModel. Это будет соответствовать только этому списку, который я хочу.

Я попытался с

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) 

выход сказуемого:

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

Выход:

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); 
      } 
     ); 
    } 
) 

, но это не то, что я хочу. Я хочу знать, как я получу только те списки данных, где EntryModel.type - тип «грудь» или «бутылка».

Спасибо.

+0

Можете ли вы предоставить некоторые примеры данные, показывающие, что вы хотите, чтобы ваш запрос соответствовал тому, что он на самом деле соответствует? Трудно понять из вашего описания, что именно вы хотите, чтобы запрос работал по-другому. – bdash

+0

@bdash Я обновил свой вопрос и, пожалуйста, дайте мне знать, что вы можете понять мой вопрос или нет. Мой английский не так хорош. Если вы можете дать мне решение, я буду вам смирен. Спасибо – Jihan

+0

Является ли ваше намерение закончить с помощью «Результаты », где каждый из них содержит свойство entryModelList' EntryModelList', фильтруется, поэтому он содержит только объекты с соответствующим свойством 'type'? – bdash

ответ

1

Results.filter(_:) позволяет только фильтровать, какие объекты данного типа включены в результирующий набор. Он не поддерживает фильтрацию объектов, которые включены в значения свойств этих объектов.

Чтобы сделать то, что вы после того, как вы должны были бы использовать filter(_:) на каждом из entryModelList свойств объектов вы работаете с, чтобы включать в себя только те, что вы заинтересованы.