You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:22:05