Realm Any
RealmAny
用于表示多态 Realm 值。
在任何特定时刻,此类的实例都会存储确定类型的确定值。 如果,实例,这是一个Double
值,您可以调用asDouble来提取该值。您可以调用type来了解当前存储的值的类型。 在不存储Double
值的实例上调用asDouble
会引发IllegalStateException 。
RealmAny
在除 Realm 对象之外的所有受支持类型上,其行为类似于值类型。 这意味着 Realm 不会保留对实际RealmAny
值的任何更改。 如果RealmAny
持有RealmObject ,则它仅持有对该对象的引用,而不是该对象的副本。 由于RealmAny
实例不可变,因此需要新实例来更新RealmAny
属性。
anObject.realmAnyField = RealmAny.create(42.0)
anObject.realmAnyField = RealmAny.create("Hello")
anObject.realmAnyField = RealmAny.create(MyRealmObject())
提取特定类型值的行为需要对存储类型有明确的了解,了解这一点至关重要。 为与存储的值类型不同的任何特定类型调用 getter 方法都会导致抛出异常。
处理 RealmAny 多态性的建议是,在RealmAny
类型及其内部值类周围使用when
编写条件表达式。
val realmAny = anObject.realmAnyField
when (realmAny.type) {
INT -> doSomething(realmAny.asInt()) // or as any other primitive derived from 'Number'
BOOLEAN -> doSomething(realmAny.asBoolean())
STRING -> doSomething(realmAny.asString())
BYTE_ARRAY -> doSomething(realmAny.asByteArray())
REALM_INSTANT -> doSomething(realmAny.asRealmInstant())
FLOAT -> doSomething(realmAny.asFloat())
DOUBLE -> doSomething(realmAny.asDouble())
OBJECT_ID -> doSomething(realmAny.asObjectId())
REALM_UUID -> doSomething(realmAny.asRealmUUID())
REALM_OBJECT -> doSomething(realmAny.asRealmObject<MyRealmObject>())
LIST -> doSomething(realmAny.asList())
DICTIONARY -> doSomething(realmAny.asDictionary())
}
Short 、 Int 、 Byte 、 Char和Long值在内部转换为int64_t
值。 在比较不同数字类型生成的RealmAny
值时,必须注意这一点,例如:
RealmAny.create(42.toShort()) == RealmAny.create(42.toByte()) // true
RealmAny
无法存储null
值,尽管RealmAny
属性必须声明为可为 null:
class Warehouse {
var nonNullableStorage: RealmAny = RealmAny.create("invalid") // This is NOT allowed
var nullableStorage: RealmAny? = RealmAny.create("valid") // Property MUST be nullable
var defaultNullStorage: RealmAny? = null // Property MUST be nullable
}
warehouse.nullableStorage = RealmAny.create(22)
warehouse.nullableStorage = null // Assign null directly to the property
RealmAny
无法存储EmbeddedRealmObject 。
RealmAny
可包含 RealmAny 的其他 RealmList 和 RealmDictionary 。这意味着您可以在RealmAny
字段内构建嵌套集合。
realmObject.realmAnyField = realmAnyListOf(
// Primitive values can be added in collections
1,
// Lists and dictionaries can contain other nested collection types
realmListOf(
realmListOf(),
realmDictionaryOf()
),
realmDictionaryOf(
"key1" to realmListOf(),
"key2" to realmDictionaryOf())
)
DynamicRealmObject和DynamicMutableRealmObject可在RealmAny
内部使用,搭配DynamicRealmObject
的相应创建函数,以及使用DynamicRealmObject
或DynamicMutableRealmObject
作为泛型参数的asRealmObject 。
RealmAny
值可以排序。 不同RealmAny
类型之间使用的排序顺序(从低到高)为:
布尔
字节/短整型/整数/长整型/浮点型/双精度型/十进制 128
字节[]/字符串
Date
ObjectId
UUID
RealmObject
RealmAny
属性可以被聚合。 RealmQuery.max和RealmQuery.min根据上述排序条件生成结果,因此输出类型将是包含相应多态值的RealmAny
实例。 RealmQuery.sum计算所有数值的总和,忽略其他数据类型,并返回Decimal128结果 - SUM
不能进行类型强制转换,换言之,不允许像这样的查询:
realm.query<Warehouse>()
.sum<Float>("nullableStorage") // type CANNOT be coerced to Float
类型
属性
返回RealmAny
实例的类型。
功能
以ByteArray形式返回此RealmAny
中的值。
以Decimal128 形式返回此RealmAny
中的值。
以包含新 RealmAny 的 RealmDictionary 形式 返回此 中的值。RealmAny
以BsonObjectId 形式返回此RealmAny
中的值。
以RealmInstant 形式返回此RealmAny
中的值。
将此 RealmAny 中的值作为T类型的BaseRealmObject返回。
从BaseRealmObject值创建非托管RealmAny
实例。
以RealmUUID 形式返回此RealmAny
中的值。