Docs 主页 → 开发应用程序 → Atlas Device SDKs
混合 - React Native SDK
realm@10.5.0
版本中的新增功能。
混合数据类型是一种 Realm 属性类型,可以保存除collection之外的任何有效 Realm 数据类型。您可以创建mixed
类型的collection(列表、集和字典),但mixed
类型本身不能是collection。
混合类型是可索引的,但不能将其用作主键。
使用“混合”类型的属性可以包含 null 值,并且不能定义为可选。 Realm 混合类型中 JavaScript Number
类型的所有实例都映射到 Realm double
类型。
Realm 对象模型
要将对象模型的属性设置为“混合”,请将该属性的类型设置为mixed
。
创建具有混合值的对象
创建具有混合值的对象,方法是使用 新 的 写事务中的操作符。
例子
在以下CreateCatsInput
示例中,我们为birthDate
字段创建多个具有混合类型的Cat
Realm 对象。
CreateCatsInput
组件将执行以下操作:
调用
useRealm()
钩子以访问打开的 Realm 实例。- 使用 React 的 useEffect 钩子
- 使用
useEffect
和空依赖项数组仅调用匿名函数一次。
- 在匿名函数中,我们通过以下方式创建了四个不同的
Cat
对象: - 使用
new
操作符在写事务中创建新的 Realm 对象。 每个Cat
对象对birthDate
属性使用不同的数据类型。
- 在匿名函数中,我们通过以下方式创建了四个不同的
使用
useQuery()
钩子检索所有Cat
对象。- 地图 通过这些猫来渲染
- 显示每只猫的
name
和birthDate
的Text
组件列表。
查询具有混合值的对象
要查询具有“混合”值的对象,请运行Collection.filtered()方法并传入针对非“混合”字段的筛选器。然后,您可以打印 Mixed 属性的值或整个对象本身。
例子
在以下CatInfoCard
示例中,我们使用猫的名称查询Cat
对象。
CatInfoCard
组件将执行以下操作:
通过将
Cat
类传递给useQuery()
钩子来获取所有Cat
对象,然后使用filtered()
筛选结果以仅接收名称与作为属性传递的名称匹配的猫。 然后,我们获取第一只匹配的猫并将其存储为常量变量。使用点表示法检索“混合”属性
birthDate
。如果 Realm 找到了猫,则在呈现方法中显示猫的名称和出生日期。 如果没有与作为属性传递给组件的名称匹配的猫,我们会渲染“未找到猫”的文本。
混合属性和类型检查
由于混合属性可以有多个类型,因此您不能依赖该属性的值是特定类型。
使用Object.getPropertyType() ,您可以获得混合属性的基础类型。这允许您构建自己的类型检查。
// Use Type Predicates and Object.getPropertyType() to // create a runtime type check for Mixed properties. const isString = ( val: Mixed, name: string, object: Realm.Object, ): val is Realm.Types.String => { return object.getPropertyType(name) === 'string'; }; type CatInfoCardProps = {catName: string}; const CatInfoCard = ({catName}: CatInfoCardProps) => { const cat = useQuery( Cat, cats => { return cats.filtered(`name = '${catName}'`); }, [catName], )[0]; // Use the type check to handle your data. const catBirthDate = isString(cat.birthDate, 'birthDate', cat) ? cat.birthDate : cat.birthDate.toString(); if (cat) { return ( <> <Text>{catName}</Text> <Text>{catBirthDate}</Text> </> ); } else { return <Text>Cat not found</Text>; } };