2017-05-02 2 views
2

Ich kann keine Liste mit Realm erstellen, um sie mit einem Realm ListView zu verwenden.Wie funktioniert die Listeneigenschaft von realm?

Ich brauche 2 oder 3 Listviews zu machen, um die Teile des Codes unten sehen kann:

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}); 

ich einen ersten Listview mit dem folgenden Code ein:

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) 
    }); 
    } 

ich habe versucht, eine Liste Eigenschaft mit

UserListSchema

zu machen

ohne Erfolg.

Und jetzt diese Listview funktioniert auch gut, wenn ich

realm.objects('User')

als Datenquelle verwendet wird.

Ich weiß nicht, ob es gut ist, so zu tun oder nicht.

Das zweite ListView ist ein "Suchverlauf", wenn eine Zeile des ersten ListView angeklickt wird, hat es die folgende Methode aufgerufen, die einen anderen Bildschirm drückt (react-native-navigation-Paket) und eine Realm-Liste auffüllen. Ich möchte diese Liste als Datenquelle für die ‚Geschichte Listview verwenden“

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}); 
    }); 
    } 
} 

Ich habe diesen Fehler:.

'Property' must be of type number

ich auch versucht:

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); 
    }); 
    } 
} 

Und ich habe diese Fehler:

Attempting to create an object of type 'User' with an existing primary key value

Tut es bedeutet, dass ich "meine Benutzer" nicht im "UserEntrySchema" verwenden kann, um sie in eine Realm-Liste zu verschieben?

ich wirklich etwas Hilfe schätzen würde, es mit diesem in der Woche, die ich bin hart stecken hat: +1:

Dank!

PS: Hier ist, wie die Geschichte Listview ist codiert:

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)} 
     /> 
    ); 
    } 

Und das Protokoll meiner rowData, wenn ich eine Zeile des Listview geklickt:

'ROWDATA', { id: 5, 

    name: 'Chelsey Dietrich', 

    username: 'Kamren', 

    email: '[email protected]', 

    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' } } 
+0

Haben Sie ernsthaft jemand erwarten, einen Essay zu lesen? [Wie man ein minimales, vollständiges und überprüfbares Beispiel erstellt] (http://stackoverflow.com/help/mcve) – Christoph

Antwort

2

ich auf eine Frage nur geantwortet über Objekte auflisten werfen Sie einen Blick auf diesen Link, und fragen Sie nach weiteren Erläuterungen, wenn Sie es brauchen. Am Ende des Posts habe ich ein funktionierendes Beispiel für das Erstellen/Ändern/Anhängen/Löschen von Objekten aus einem Realm-List-Objekt zur Verfügung gestellt. How can I properly copy objects from one Realm object to another object

eine Liste zu erstellen ist ziemlich einfach, hier ist der einfachste Fall:

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

So eine Liste zu erstellen, müssen Sie die Objektunterklasse wissen Sie verwenden werden. (Buchstabe im obigen Beispiel).

zur Liste hinzuzufügen, erstellen Sie ein Objekt (Punkt - unten) und dann in die Liste anhängen:

firstList.letterList.append(item) 
+0

Hallo, ty für deine Antwort. Ich habe gewählt, keine Listeneigenschaft zu verwenden, sobald ich den DB-Inhalt in meinen ListViews ohne es anzeigen kann. Ich setze einfach meine DataSource mit 'realm.objects ('dbName')' und aktualisiere sie mit 'cloneWithRows (realm.objects ('dbName')' ' –

Verwandte Themen