Ios 用于从表1筛选数据的域子查询w.r.t表2

Ios 用于从表1筛选数据的域子查询w.r.t表2,ios,swift,xcode,realm,realm-mobile-platform,Ios,Swift,Xcode,Realm,Realm Mobile Platform,假设我在领域数据库中有两个模型和相应的表 public class Customer :Object { dynamic var Id : String = "" dynamic var NAME : String = "" dynamic var Address : String = "" override public class func primaryKey() -> String? { return "Id" } } pu

假设我在领域数据库中有两个模型和相应的表

public class Customer :Object {
   dynamic var  Id : String = ""
   dynamic var  NAME : String = ""
   dynamic var  Address : String = ""

   override public class func primaryKey() -> String? {
      return "Id"
   }  
}


public class Bills :Object {
    dynamic var  Id : String = ""
    dynamic var  Amount : String = ""
    dynamic var  CustomerId : String = ""

    override public class func primaryKey() -> String? {
        return "Id"
    }
}
我在做什么:我可以通过以下操作轻松获得所有客户的名单 这个

我想要什么:我想做以下几件事

我希望获得所有客户列表,但我也希望列表中包含这样的客户,他们购买物品的频率更高。我的意思是,我希望根据从我们商店购买更多时间的客户进行列表订购。为此,我可以从账单表中的客户Id中获取它。 但我不知道如何在领域内做到这一点。


我知道它可以通过子查询完成,但我不知道如何在领域中完成它。请告诉我这里将使用什么查询/谓词来获得所需的结果

我有两个答案,但有几件事需要首先解决

对于这两个类,如果希望它们由领域管理,则需要在要管理的每个var之前包含@objc

public class Customer :Object {
   @objc dynamic var  Id : String = ""
或者可选地将@objcMembers添加到类名中

@objcMembers class Customer :Object {
       dynamic var  Id : String = ""
另一件事是类属性(vars)应该总是小写,类名应该以大写开头。什么都不应该是大写的

public class Customer :Object {
   @objc dynamic var  customer_id : String = ""
   @objc dynamic var  name : String = ""
第一个解决方案是使用您当前的结构:

var topCustomers = [(String, Int)]() //stores the customer id and count in an array of tuples
let results = realm.objects(Bills.self) //get all the bills
let allCustomerIds = results.map{ $0.CustomerId } //get a list of all of the customer id's
let uniqueIds = Set(allCustomerIds) //create a set of unique customer ids

for custId in uniqueIds { //iterate over the array of unique customer id's
    let count = results.filter("CustomerId == %@", custId).count // get a count of each customer id from results
    topCustomers.append( (custId, count) ) //add the customer id and it's count to the array
}

topCustomers.sort { $0.1 > $1.1 } //sort the array by count
for x in topCustomers { //print out the array - the customer with the most bills will be at the top
    print(x.0, x.1)
}
第二种更优雅的方法是利用客户与其账单之间的关系。这将为生成报告、查询和整体组织提供更大的灵活性

以下是更新的课程:

class CustomerClass: Object {
   @objc dynamic var  customer_id = UUID().uuidString
   @objc dynamic var  name = ""
   @objc dynamic var  address = ""

   let billList = List<BillClass>()

   override public class func primaryKey() -> String? {
      return "customer_id"
   }
}

class BillClass: Object {
    @objc dynamic var  bill_id = UUID().uuidString
    @objc dynamic var  amount = ""

    override public class func primaryKey() -> String? {
        return "bill_id"
    }
}
注意UUID()的使用。UUIString

@objc dynamic var  bill_id = UUID().uuidString

为对象创建唯一的主键。无需处理索引、唯一性、递增等问题。

实际上,这两个对象之间没有正式关系。我看到您将CustomerId存储在账单上,但这只是一个字符串,不是关系。你应该在文档中查看。第二,你的目标是模糊的-顾客购买更多的时间。这意味着什么-在指定时间内的实际购买数量?或随时间购买的物品数量?要做到这一点,您需要存储一个时间戳,例如,您可以查询过去六个月内拥有5张以上账单的所有客户。最初的想法是账单表将保存从商店购买任何产品的客户Id。因此,我们可以查询账单表中大多数重复的客户Id,以了解特定的客户让我们称之为客户34购买更多的东西,让我们说他的Id在该表中存在44次。客户2购买了第二多的产品,因此他的id在账单表中驻留了40次。我已经阅读了这些关系,但没有弄清楚您将如何帮助meI认为在客户类中保存名为
totalBillsCount
的变量将使您的生活更轻松。我没有理解您,我不知何故使用了与您在中使用的相同的技术完成了相同的任务你的解决方案1。其次,在解决方案2中也没有使用子查询。。为什么?Realm不允许子查询?@A.s.ALI是的,Realm允许子查询,但它非常有限(IMO),我们还需要排序,这不能直接用于此用例。第二种方法非常简单,代码也很短,所以在这种情况下似乎不需要它。谢谢Jay,但是你能帮我解决这个问题吗@阿里,我在这里回答。这个问题,虽然我知道你在问什么,但非常模糊,并且开始得到反对票。您应该澄清问题并提供更好的用例。i、 e.如果您使用的是Firebase,则use A所做的更改将在重新建立连接时自动同步到服务器。如果您使用的是Realm,它也会以类似的方式运行。如果您使用的是MySQL,那么如果没有额外的资源,就不会发生这种情况。MongoDB也可以同步。看见有很多不同的答案,所以问题需要更加具体。在iOS中我使用的是realm,在android中我使用的是green dao。在服务器端,我使用的是MySql数据库。所以,如果用户登录到3个不同的设备,比如web、ios mobile和android,我希望我的web、android和ios设备保持同步
let customers = realm.objects(CustomerClass.self) //get all customers
let results = customers.map { ($0.name, $0.billList.count) } //iterate over all, creating tuple with customer name & bill count
let sortedResults = results.sorted(by: { $0.1 > $1.1} ) //sort by bill count, descending
sortedResults.forEach { print($0) } //print the results, customer will most bills at top
@objc dynamic var  bill_id = UUID().uuidString