如何过滤领域子类 swift

How to filter a realm subclass swift

如何在 swift 的领域中过滤子class?

我有一个领域class“订阅类”:

class SubscriptionClass: Object {
   @Persisted(primaryKey: true) var subscriptionId = "" //the primary key
   @Persisted var subscription_number = 0
   @Persisted var question: String = ""
   @Persisted var option1: String = ""

有 2 个实例:

let sub1 = SubscriptionClass()
sub1.subscriptionId = "Grade 1" //<- the primary key
sub1.subscription_number = 1  //<- the subscription number
sub1.question = "What is 3 * 3"
sub1.option1 = "9"

let sub2 = SubscriptionClass()
sub2.subscriptionId = "Grade 2"
sub2.subscription_number = 2
sub2.question = "What is 5 * 5"
sub2.option1 = "25"

let realm = try! Realm()
realm.write {
   realm.add(sub1)
   realm.add(sub2)
}

访问主订阅类:

let allSubscriptionClassResults = realm.objects(SubscriptionClass.self)

访问特定子class:

let sub1ClassResults = realm.object(ofType: SubscriptionClass.self, forPrimaryKey: subscriptionId)

但是,为了提高效率,我如何过滤子class 中的项目,例如问题“5*5 是多少”?

通过 primary_key 搜索对象只会为您提供一个特定对象(如果存在)或 returns nil。它的时间复杂度在 O(1).

没有比这更有效的过滤器选项了。因为在引擎盖下它的工作方式就像查看字典和 return 它存在的对象一样。在 filter 的情况下,它的工作方式就像遍历数据库中的对象和 return 匹配的对象。

如果你想 filter 对象与其他 属性 不是 primary_key 那么它 return 是一个对象数组,@Larme 已经评论过。但是它的时间复杂度是O(n)。这是代码

let objects = realm.objects(SubscriptionClass.self).filter("question == What is 5 * 5")

objects.forEach { object in
    // do whatever you want
    print(object)
}

如果只有一个对象的特定值为 属性(不是 primary_key),那么您可以使用 filter 访问该对象,如下所示。

if let object = realm.objects(SubscriptionClass.self).filter("question == What is 5 * 5").first {
    // do whatever you want
    print(object)
}

这里实际上有多个问题。首先,我们需要将单词 subclass 的用法更改为 instance。问题中没有子类。

请注意,Realm 在概念上是一个“对象”数据库,因此我们将使用 'object' 一词来引用存储在 Realm 中的对象('instances',当它们被加载到记忆)

为了清楚起见,我将重新措辞:

  1. How do I return all SubscriptionClass objects?
let results = realm.objects(SubscriptionClass.self)
  1. How do I return one specific SubscriptionClass object if I know the primary key?
let oneObject = realm.object(ofType: SubscriptionClass.self, forPrimaryKey: theObjectsPrimaryKey)
  1. How do I return all of the SubscriptionClass objects that match a specific criteria; where the question property equals What is 5*5
let results = realm.objects(SubscriptionClass.self).filter("question == 'What is 5*5'")

我将在#4 中滑动:这会像在#3 中一样查询所有问题,但只有 return 它找到的第一个问题。这可能很危险,因为 Realm 对象是无序的,所以如果有不止一个对象,它可能 return 每次使用时都是不同的第一个对象

if let oneObject = realm.objects(SubscriptionClass.self).filter("question == 'What is 5*5'").first {
    //do something with the object
}

子类:

子类继承超类的功能并扩展它以提供额外的功能。这是一个子类,它为 SubscriptionClass 的子类('super class')

添加了难度 属性
class SubscriptionWithDifficultySubClass: SubscriptionClass {
   var difficulty = ""  //Easy, Medium, Hard etc
}

然后是提供主题的不同子类属性:

class SubscriptionWithSubjectSubClass: SubcriptionClass {
  var subject = ""  //Math, Grammar, Science etc
}