如何过滤领域子类 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',当它们被加载到记忆)
为了清楚起见,我将重新措辞:
- How do I return all
SubscriptionClass
objects?
let results = realm.objects(SubscriptionClass.self)
- How do I return one specific
SubscriptionClass
object if I know the
primary key?
let oneObject = realm.object(ofType: SubscriptionClass.self, forPrimaryKey: theObjectsPrimaryKey)
- 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
}
如何在 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',当它们被加载到记忆)
为了清楚起见,我将重新措辞:
- How do I return all
SubscriptionClass
objects?
let results = realm.objects(SubscriptionClass.self)
- How do I return one specific
SubscriptionClass
object if I know the primary key?
let oneObject = realm.object(ofType: SubscriptionClass.self, forPrimaryKey: theObjectsPrimaryKey)
- How do I return all of the
SubscriptionClass
objects that match a specific criteria; where the question property equalsWhat 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
}