RealmAny

接口 RealmAny

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())
}

ShortIntByteCharLong值在内部转换为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())
)

DynamicRealmObjectDynamicMutableRealmObject可在RealmAny内部使用,搭配DynamicRealmObject的相应创建函数,以及使用DynamicRealmObjectDynamicMutableRealmObject作为泛型参数的asRealmObject

RealmAny 值可以排序。 不同RealmAny类型之间使用的排序顺序(从低到高)为:

  • 布尔

  • 字节/短整型/整数/长整型/浮点型/双精度型/十进制 128

  • 字节[]/字符串

  • Date

  • ObjectId

  • UUID

  • RealmObject

RealmAny 属性可以被聚合。 RealmQuery.maxRealmQuery.min根据上述排序条件生成结果,因此输出类型将是包含相应多态值的RealmAny实例。 RealmQuery.sum计算所有数值的总和,忽略其他数据类型,并返回Decimal128结果 - SUM不能进行类型强制转换,换言之,不允许像这样的查询:

    realm.query<Warehouse>()
.sum<Float>("nullableStorage") // type CANNOT be coerced to Float

类型

链接已复制到剪贴板
对象 Companion
链接已复制到剪贴板

可存储在RealmAny实例中的受支持 Realm 数据类型。

属性

链接已复制到剪贴板
摘要 val 类型: RealmAny.Type

返回RealmAny实例的类型

功能

链接已复制到剪贴板
摘要 乐趣 asBoolean(): 布尔

以布尔值形式返回此RealmAny

链接已复制到剪贴板
摘要 乐趣 asByte(): 字节

Byte形式返回此RealmAny中的值。 使用ShortIntByteCharLong值创建的RealmAny实例可以安全地转换为这些类型中的任何一个,尽管可能会发生溢出,例如,如果要作为Short输出的值大于Byte。 MAX_VALUE

链接已复制到剪贴板
摘要 乐趣 asByteArray(): 字节数组

ByteArray形式返回此RealmAny中的值。

链接已复制到剪贴板
摘要 乐趣 asChar(): 字符

将此RealmAny中的值以Char形式返回。 使用ShortIntByteCharLong值创建的RealmAny实例可以安全地转换为这些类型中的任何一个,尽管可能会发生溢出,例如,如果要作为Short输出的值大于Char。 MAX_VALUE

链接已复制到剪贴板
摘要 乐趣 asDecimal128(): Decimal128

Decimal128 形式返回此RealmAny中的值。

链接已复制到剪贴板

以包含新 RealmAny 的 RealmDictionary 形式 返回此 中的值。RealmAny

链接已复制到剪贴板
摘要 乐趣 asDouble(): double

Double形式返回此RealmAny的值。

链接已复制到剪贴板
摘要 乐趣 asFloat(): Float

Float形式返回此RealmAny的值。

链接已复制到剪贴板
摘要 乐趣 asInt(): Int

Int形式返回此RealmAny中的值。 使用ShortIntByteCharLong值创建的RealmAny实例可以安全地转换为这些类型中的任何一个,尽管可能会发生溢出,例如,如果要作为Short输出的值大于Int。 MAX_VALUE

链接已复制到剪贴板
摘要 乐趣 asList(): RealmList<RealmAny?>

以包含新 RealmAny 的 RealmList 形式 返回此 中的值。RealmAny

链接已复制到剪贴板
摘要 乐趣 asLong(): Long

Long值形式返回此RealmAny的值。 使用ShortIntByteCharLong值创建的RealmAny实例可以安全地转换为其中任何类型。

链接已复制到剪贴板
摘要 乐趣 asObjectId(): BsonObjectId

BsonObjectId 形式返回此RealmAny中的值。

链接已复制到剪贴板
摘要 乐趣 asRealmInstant(): RealmInstant

RealmInstant 形式返回此RealmAny中的值。

链接已复制到剪贴板
摘要 乐趣 <t : BaseRealmObject> asRealmObject(clazz : KClass < T >): t

将此 RealmAny 中的值作为T类型的BaseRealmObject返回。

链接已复制到剪贴板

BaseRealmObject值创建非托管RealmAny实例。

链接已复制到剪贴板
摘要 乐趣 asRealmUUID(): RealmUUID

RealmUUID 形式返回此RealmAny中的值。

链接已复制到剪贴板
摘要 乐趣 asShort():

将此RealmAny中的值以Short形式返回。 使用ShortIntByteCharLong值创建的RealmAny实例可以安全地转换为这些类型中的任何一个,尽管可能会发生溢出,例如,如果要作为Short输出的值大于Short。 MAX_VALUE

链接已复制到剪贴板
摘要 乐趣 asString(): 字符串

字符串形式返回此RealmAny中的值。

链接已复制到剪贴板
摘要 操作符覆盖 乐趣 等于(other 有吗): 布尔

两个RealmAny实例相等当且仅当它们的类型和内容相等。

链接已复制到剪贴板
摘要 覆盖 乐趣 hashCode(): Int