ios - 如何在 swift 4 中访问过滤器中的 Realm 模型列表?

标签 ios arrays swift list realm

这是我的对象/模型

import RealmSwift
class IBPChapters: Object {

    @objc dynamic var ibp_chapter_id = 0
    @objc dynamic var chapter = ""
    @objc dynamic var chapter_president = ""
    @objc dynamic var office_no = ""
    @objc dynamic var email_address = ""
    @objc dynamic var services_offered = ""
    var service = List<Services>()
    @objc dynamic var locid = 0
    @objc dynamic var loc:Locations?
    @objc dynamic var status = 0

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

服务模式

import RealmSwift
class Services: Object{

    @objc dynamic var service_id = 0
    @objc dynamic var service = ""
    @objc dynamic var status = 0
    @objc dynamic var ibp_service_filter = true
    @objc dynamic var pao_service_filter = true
    @objc dynamic var lac_service_filter = true

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

示例数据

1. legal aid,outreach,counseling,case handling
2. legal aid,counseling
3. outreach,counseling

附加数据

if Chapter.service[0].ibp_service_filter == true ,附加所有具有法律援助的数据

输出将为1和2//预期输出

如果chapter.service[1].ibp_service_filter == true,则附加所有具有咨询的数据,但如果id已经存在,则忽略该索引并继续下一个数据

输出将为1和2和3//预期输出

func addData(){

    var ibpArray:[IBPChapters] = []

    let chapters = realm.objects(IBPChapters.self)//condition for filter here
    for chapter in chapters{
        print(chapter.service)
        ibpArray.append(chapter)

        //Legal Aid service[0]
        if chapter.service[0].ibp_service_filter == true{
            ibpArray.append(chapter)
        }
        //Counseling service[1]
        if chapter.service[1].ibp_service_filter == true{
            ibpArray.append(chapter)
        }
        //Outreach service[2]
        if chapter.service[2].ibp_service_filter == true{
            ibpArray.append(chapter)
        }
        //Case Handling service[3]
        if chapter.service[3].ibp_service_filter == true{
            ibpArray.append(chapter)
        }
    }
}

我的输出 1,2,3,1,2,3,1,2,3,1,2,3//<- 错误输出

只有1和2有法律援助,所有1,2和3都有咨询服务,所以我不需要附加1和2 再次,因为我已经将它们附加到第一个循环的数组中

我如何访问我的过滤器 Realm 的列表,以便我可以操纵数据,或者您有任何想法或替代方法来生成我的预期输出

我可以使用数组索引来过滤吗? 例如。 .filter("services[0].ibp.filtered == true)

正确输出

func addData(){

    let chapters = realm.objects(IBPChapters.self)
    for chapter in chapters{
        let filteredServices = chapter.service.filter("ibp_service_filter == true")
        for service in filteredServices{
            let service_index = filteredServices.index(of: service)
            if chapter.service.contains(filteredServices[service_index!]){
                if !ibpArray.contains(where: {$0.ibp_chapter_id == chapter.ibp_chapter_id}){
                    ibpArray.append(chapter)
                }
            }
        }
    }
}

但我仍然想知道是否有更好的答案或比我的答案更短,或者可以说更少的循环和条件

最佳答案

Realm 支持 .filter()基于NSPredicate的函数。因此,首先您应该获得 ibp_service_filter == true 值:

let filteredServices = chapter.service.filter("ibp_service_filter == true")

然后仅保存 uniq id(基本思想):

for service in filteredServices where !history_ibp.contains(where: { $0. service_id == service.service_id }) {
    history_ibp.append(service)
}

关于ios - 如何在 swift 4 中访问过滤器中的 Realm 模型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379353/

相关文章:

ios - 是否可以在不子类化的情况下替换UIWebView中现有方法的主体

ios - 在 iOS 中,我应该在哪里持久和线程安全地存储单个值?

ios - iOS 是否有任何等同于 DLL/IPC/进程生成的东西?

c++ - 在运行时更改数组维度

JavaScript 继承与 Array 对象(需要解释才能理解)

swift - 模块外部未检测到具有协议(protocol)一致性的扩展

ios - 在 firebase 中如何删除所有观察者,而不是特定引用的观察者

javascript - 如何通过从另一个对象中选择特定属性来克隆新的对象数组?

swift - Firestore 查询 Swift 4.0 缺少返回

ios - 尝试保存数组时 CoreData 出错。 'Cannot convert value of type ' String' 到预期参数类型 'NSManagedObject' '