0

开发一个 react-native 应用程序,该应用程序记录用户在“记忆”中行走的坐标,并将记忆(带有描述)和一组坐标存储在 Realm 中。

我在具有不同数据库的项目中使用了 ListView,但是使用 realm-listview 我无法获得页面上呈现的记忆的描述。

将我的领域设置存储在一个文件中,如下所示。主要操作是将数据存储在内存/坐标模式中,并使用 RealObjects.countMemories() 函数获取要在 ListView 中使用的数据。当我在控制台中查看它时,它正确地返回了一个领域对象数组。

export default class RealmObjects {}
RealmObjects.MemorySchema = {
  name: 'Memory',
  properties: {
    description: 'string',
    coords: {type: 'list', objectType: 'Coordinate'},
  }
}

RealmObjects.CoordinateSchema = {
  name: 'Coordinate',
  properties: {
    longitude: 'double',
    latitude: 'double',
    timeStamp: 'double'
  }
}

RealmObjects.saveMemory = function(coordinates, description) {
  console.log('---------------realm write-------------')
  console.log(description)
  console.log(coordinates)
    realm.write(() => {
      let memory = realm.create('Memory', {
        description: description,
        id: 1
      });
      let coordList = memory.coords
      for (var i = 0; i < coordinates.length; i++) {
        console.log(i)
              console.log(coordinates[i].timeStamp)

        coordList.push({longitude: coordinates[i].longitude,
          latitude: coordinates[i].latitude,
         timeStamp: coordinates[i].timeStamp});
        console.log(memory.coords[i].timeStamp)
      }

    });
}

RealmObjects.countMemories = function() {
  console.log(realm.objects('Memory'));
  return realm.objects('Memory');
}

import Realm from 'realm';
let realm = new Realm({schema: [RealmObjects.MemorySchema, RealmObjects.CoordinateSchema]});

在我的组件中,我正在像这样导入 ListView 组件import { ListView } from 'realm/react-native';

构造函数设置如下:

  constructor() {
    super();
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
      dataSource: ds.cloneWithRows(RealmObjects.countMemories()),
    };
    console.log('datasource')
    console.log(this.state.dataSource)
  }

渲染函数设置如下:

  render() {
    return (
      <View style={styles.container}>
        <TouchableHighlight style={styles.buttonLeft} onPress={() => this.goBack()}>
          <Text>Back</Text>
        </TouchableHighlight>
        <ListView style={styles.listview}
          dataSource={this.state.dataSource}
          renderRow={(rowData) => <Text>something: {rowData.description}</Text>}
        />
      </View>
    );
  }

此渲染方法不会在 ListView 中生成任何内容。现在,我只是想获得一份要在屏幕上显示的记忆描述列表。

react-native 和 realm 都是新手,所以不确定我的问题是在这里还是其他地方。任何帮助表示赞赏!

编辑:将渲染行和行数据项更改为如下所示以记录数据,该数据记录控制台中每一行的正确描述,但屏幕上仍不显示任何内容:

  renderRow(rowData) {
    console.log('my data');
    console.log(rowData.description);

    return (
        <Text>{rowData.description}</Text>
    );
  }

  render() {
    return (
      <View style={styles.container}>
        <TouchableHighlight style={styles.buttonLeft} onPress={() => this.goBack()}>
          <Text>Back</Text>
        </TouchableHighlight>
        <ListView style={styles.listview}
          dataSource={this.state.dataSource}
          renderRow={(rowData) => this.renderRow(rowData)}
        />
      </View>
    );
  }

编辑:当前样式:

const styles = StyleSheet.create({
  button: {
    paddingHorizontal: 12,
    alignItems: 'center',
    marginHorizontal: 10,
    top: 50,
    backgroundColor: 'rgba(236,64,122,0.7)',
    paddingVertical: 12,
  },
  listview: {
    top: 100,
    backgroundColor: 'rgba(236,64,122,0.7)',
  },
  container: {
    flex: 1,
    flexDirection: 'column',
    marginTop: 60,
  },
  buttonRight: {
    position: 'absolute',
    top: 0,
    right: 5,
    backgroundColor: 'rgba(236,64,122,0.7)',
    paddingHorizontal: 18,
    paddingVertical: 12,
    borderRadius: 20,
  },
  buttonLeft: {
    position: 'absolute',
    top: 0,
    left: 5,
    backgroundColor: 'rgba(236,64,122,0.7)',
    paddingHorizontal: 18,
    paddingVertical: 12,
    borderRadius: 20,
  }
});
4

1 回答 1

0

我也遇到过同样的问题。但是我将来自领域的响应转换为数组,然后将其传递给平面列表,它就像一个魅力。

async getAllPrinterArray() {
          realm = await this.getRealMObject();
          favoritePrinterArray = realm.objects(constants.SCHEMA_SAVE_PRINTERS);
          console.log(favoritePrinterArray);

          if (favoritePrinterArray.length > 0) {
            this.setState({ enable: false });
            arr4 = Array.from(favoritePrinterArray);
          }
          return arr4;
      }

<FlatList
     data={printerObject}
     numColumns={2}
     renderItem={({ item }) => this.renderListRow(item)}
/>
于 2017-12-15T18:12:33.187 回答