Realm写入数据后无法访问及React Native FlatList适配问题
问题分析与解决方案
核心错误点
1. 数组遍历方式错误
你使用for (const player in players)遍历数组,for...in遍历的是数组的索引(字符串类型),而非数组元素本身。这导致写入Realm的player.id、player.firstname等都是undefined——虽然数据库显示有99条数据,但所有字段均为空值,后续访问自然异常。
2. Realm过滤语法错误
filtered('lastname = Young')中,字符串值未加单引号,Realm会将Young解析为Player模型的属性名,而非字符串值,因此报错。
3. Realm对象访问方式错误
Realm的objects()返回的是Realm.Collection对象,并非普通JS数组,直接console.log或JSON.stringify会触发内部序列化逻辑,而空数据的对象没有正确的toJSON方法,导致报错。
分步解决
1. 修复数据写入逻辑
将遍历方式改为for...of(遍历数组元素)或forEach:
realm.write(() => { // 方式1:for...of for (const player of players) { realm.create('Player', { id: player.id, firstname: player.firstname, lastname: player.lastname, }); } // 方式2:forEach(更简洁) // players.forEach(player => { // realm.create('Player', { // id: player.id, // firstname: player.firstname, // lastname: player.lastname, // }); // }); });
注意:确保
Player模型Schema已正确定义,否则写入的数据无法被正确识别:const PlayerSchema = { name: 'Player', primaryKey: 'id', // 建议设置主键避免重复写入 properties: { id: 'int', firstname: 'string', lastname: 'string', }, }; // 初始化Realm时注册Schema const realm = new Realm({ schema: [PlayerSchema] });
2. 正确查看数据库数据
将Realm集合转换为普通JS数组后再打印,或直接遍历打印每个对象的属性:
const realmPlayers = realm.objects('Player'); // 方式1:遍历打印每个玩家的具体属性 realmPlayers.forEach((player, index) => { console.log(`第${index+1}个玩家:ID=${player.id}, 姓名=${player.firstname} ${player.lastname}`); }); // 方式2:转换为普通数组后打印 const plainPlayers = Array.from(realmPlayers).map(player => ({ id: player.id, firstname: player.firstname, lastname: player.lastname })); console.log('所有玩家数据:', plainPlayers); console.log('JSON格式数据:', JSON.stringify(plainPlayers));
3. 修复过滤查询语法
字符串值需要用单引号包裹,或使用参数绑定更安全:
// 写法1:直接用单引号包裹字符串 const filteredPlayers = realm.objects('Player').filtered("lastname = 'Young'"); // 写法2:参数绑定(避免字符串拼接问题) const filteredPlayers = realm.objects('Player').filtered("lastname = $0", 'Young');
4. 适配React Native FlatList
将转换后的普通JS数组传给FlatList的data属性:
import { FlatList, Text, View } from 'react-native'; // 获取并转换数据 const plainPlayers = Array.from(realm.objects('Player')).map(player => ({ id: player.id.toString(), // FlatList需要唯一key,建议转换为字符串 firstname: player.firstname, lastname: player.lastname })); // 渲染FlatList <FlatList data={plainPlayers} keyExtractor={(item) => item.id} renderItem={({ item }) => ( <View> <Text>{item.firstname} {item.lastname}</Text> </View> )} />
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

