领域的list属性如何工作?

时间:2017-05-02 11:27:39

标签: android list listview react-native realm

我无法使用领域创建列表,以便将其与领域ListView一起使用。

我需要制作2个或3个ListView,你可以看到下面的代码片段:

realm.js:

const Realm = require ('realm');

class UserEntrySchema extends Realm.Object {}
UserEntrySchema.schema = {
   name:'User',
   primaryKey:'id',
   properties:{
     id:'int',
     name:'string',
     username: 'string',
     email: 'string',
   }
};

class UserListSchema extends Realm.Object {}
UserListSchema.schema = {
  name:'UserList',
  properties: {
    users :{type:'list', objectType:'User'}
  }
};

class HistorySchema extends Realm.Object {}
HistorySchema.schema = {
  name : 'History',
  properties :{
    items : {type:'list',objectType:'User'}
  }
};

export default new Realm({
  schema:[UserEntrySchema,UserListSchema,HistorySchema], schemaVersion:0});

我使用以下代码创建第一个ListView:

export default class SearchTabScreen1 extends Component {
  constructor(props) {
    super(props);
    this.state = {
      searchText:'',
      data:[]
    };
}

  componentDidMount(){
    this.fetchUsers();
  }

  fetchUsers(){
    console.log("FEEEEEETCH");
    fetch('http://jsonplaceholder.typicode.com/users')
        .then((response) => response.json())
        .then((responseJson) =>  {
          this.setState({
            data : responseJson
          });
          var data = this.state.data;
          realm.write(() => {
            for (var i = 0; i < data.length; i++){
              let myUser = realm.create('User',data[i],true);
         }
         console.log("ALLUSER", realm.objects('User'));
       });
      })
        .catch(function(e) {    // Failure callback registartion
              alert('Failure fetching data');
              console.log(e)
    });
  }

我尝试使用

制作列表属性
  

UserListSchema

没有成功。

现在,即使我使用

,这个ListView也能正常工作
  

realm.objects(&#39;用户&#39)

作为数据源。

我不知道这样做是不是很好。

第二个ListView是&#34;搜索历史&#34;,当点击第一个ListView的一行时,它调用以下方法推送另一个屏幕(我正在使用react-native-navigation包)并填充领域清单。我想将此列表用作历史ListView&#34;。

的数据源
onPushPress(rowData) {
    this.props.navigator.showModal({
      title: "Random Title",
      screen: "Project.WordDefinition",
      passProps: {
        definition: rowData.name
      }
    });
      realm.write(() => {
      let historyList = realm.create('History',{},true);
      historyList.items.push({rowData});
    });
  }
}

我收到了这个错误:

  

&#39;属性&#39;必须是类型编号

我也尝试过:

onPushPress(rowData) {
    console.log("ROWDATA", rowData);
    this.props.navigator.showModal({
      title: "Titre",
      screen: "AccessiDico.WordDefinition",
      passProps: {
        definition: rowData.name
      }
    });
      realm.write(() => {
      let historyList = realm.create('History',{},true);
      historyList.items.push({
        id:rowData.id,
        name:rowData.name,
        username: rowData.username,
        email: rowData.email,
      });

      console.log("ROWDATA",rowData);
      console.log("ITEMS",realm.objects('History'));
      console.log("List",historyList.items);
    });
  }
}

我收到了这个错误:

  

尝试创建类型为&#39; User&#39;的对象。与现有的主要   关键值

这是否意味着我无法使用&#34;我的用户&#34;在&#39; UserEntrySchema&#39;将它们推入领域列表中?

我真的很感激一些帮助,这是一个星期,我很难坚持这个:+1:

谢谢!

PS:这里是如何编码历史ListView的:

export default class HistoryTabScreen2 extends Component {
  constructor(props) {
    super(props);
    // if you want to listen on navigator events, set this up
    //this.props.navigator.setOnNavigatorEvent(this.onNavigatorEvent.bind(this));
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
        postDataSource: ds.cloneWithRows(realm.objects('History')),
    };
  }

  renderRow(rowData, sectionId, rowId, highlightRow){
    return(
    <TouchableHighlight onPress={this.onPushPress.bind(this)}>
      <View style={styles.row}>
        <Text style={styles.rowText}>{rowData.name}</Text>
      </View>
    </TouchableHighlight>
    )
  }


  render(){
    return(
        <ListView
          dataSource={this.state.postDataSource}
          renderRow={this.renderRow.bind(this)}
        />
    );
  }

当我点击ListView的一行时,我的rowData的日志:

'ROWDATA', { id: 5,

   name: 'Chelsey Dietrich',

   username: 'Kamren',

   email: 'Lucio_Hettinger@annie.ca',

   address: 

    { street: 'Skiles Walks',

      suite: 'Suite 351',

      city: 'Roscoeview',

      zipcode: '33263',

      geo: { lat: '-31.8129', lng: '62.5342' } },

   phone: '(254)954-1289',

   website: 'demarco.info',

   company: 

    { name: 'Keebler LLC',

      catchPhrase: 'User-centric fault-tolerant solution',

      bs: 'revolutionize end-to-end systems' } }

1 个答案:

答案 0 :(得分:2)

我刚刚回答了有关列表对象的问题。 看看这个链接,然后在需要时进一步澄清。在帖子的最后,我提供了一个从领域List对象创建/修改/追加/删除对象的工作示例。 How can I properly copy objects from one Realm object to another object

创建列表非常简单,这是最简单的情况:

class Letters: Object {
    var letterList = List<Letter>()
}

因此,要创建列表,您需要知道将要使用的Object子类。 (上例中的字母)。

要添加到列表,请创建一个对象(项目 - 下方),然后附加到列表:

firstList.letterList.append(item)