2017-02-15 46 views
0

我有两个模型类斯威夫特3需要帮助的境界查询

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

我在新的境界,所以我不很了解。我想要一个查询,它将通过使用EntryModelList的babyId和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

你能提供一些示例数据显示你希望你的查询匹配vs它实际匹配什么?从描述中很难理解你希望查询做什么不同。 – bdash

+0

@bdash我已更新我的问题,请让我知道您可以理解我的问题。我的英文不是很好。如果你能给我一个解决方案,我会对你谦虚。谢谢 – Jihan

+0

你的意图是最终得到一个'Results ',其中每个包含'EntryModelList'的'entryModelList'属性被过滤,因此它只包含具有适当'type'属性的对象? – bdash

回答

1

Results.filter(_:)只允许过滤给定类型的哪些对象包含在结果集中。它不支持过滤哪些对象包含在这些对象的属性值中。

要做到你以后,你可能需要使用filter(_:)每个你正在使用的对象entryModelList属性只包括那些你感兴趣的内容。