2017-01-21 1 views
0

Dies ist die Struktur meiner Realm-Datenbank:Korrekte Art, eine Realm-Datenbank zu aktualisieren?

public class ARDatabase extends RealmObject 
    { 
    @PrimaryKey 
    private String uid; 

    private String namex; 
    private String desc; 
    private boolean isVideo; 
    private boolean isDeleted; 
    private String urlImg; 
    private String urlApp; 
    private int updates; 
    private boolean isDownloaded; 
    private String location; 

    public ARDatabase(){} 

    public String getUid() 
    { 
     return uid; 
    } 

    public void setUid(String uid) 
    { 
     this.uid = uid; 
    } 

    public String getNamex() 
    { 
     return namex; 
    } 

    public void setNamex(String namex) 
    { 
     this.namex = namex; 
    } 

    public String getDesc() 
    { 
     return desc; 
    } 

    public void setDesc(String desc) 
    { 
     this.desc = desc; 
    } 

    public boolean getIsVideo() 
    { 
     return isVideo; 
    } 

    public void setIsVideo(boolean isVideo) 
    { 
     this.isVideo = isVideo; 
    } 

    public boolean getIsDeleted() 
    { 
     return isDeleted; 
    } 

    public void setIsDeleted(boolean isDeleted) 
    { 
     this.isDeleted = isDeleted; 
    } 

    public String getUrlImg() 
    { 
     return urlImg; 
    } 

    public void setUrlImg(String urlImg) 
    { 
     this.urlImg = urlImg; 
    } 

    public String getUrlApp() 
    { 
     return urlApp; 
    } 

    public void setUrlApp(String urlApp) 
    { 
     this.urlApp = urlApp; 
    } 

    public int getUpdates() 
    { 
     return updates; 
    } 

    public void setUpdates(int updates) 
    { 
     this.updates = updates; 
    } 

    public boolean getIsDownloaded() 
    { 
     return isDownloaded; 
    } 

    public void setIsDownloaded(boolean isDownloaded) 
    { 
     this.isDownloaded = isDownloaded; 
    } 

    public String getLocation() 
    { 
     return location; 
    } 

    public void setLocation(String location) 
    { 
     this.location = location; 
    } 
    } 

Und ich kann erfolgreich Objekte in die Datenbank aufzunehmen.
Das Problem kommt, wenn ich ein Objekt aktualisieren muss. Diese

ist, was ich versucht:

private void downloadUpdateDatabase(String uid,String location_address) throws RealmException 
{ 

    mRealm.beginTransaction(); 
    ARDatabase db = new ARDatabase(); 
    db.setUid(uid); 
    db.setIsDownloaded(true); 
    db.setLocation(location_address); 
    mRealm.copyToRealmOrUpdate(db); 
    mRealm.commitTransaction(); 
    Log.e("TAG","DOWNLOAD UPDATE COMPLETED"); 

} 

Das Problem hier ist, wenn ich diese Methode aufrufen. Die erwähnten Felder werden aktualisiert, aber die nicht erwähnten Felder in dieser Methode werden null oder null.
Natürlich kann ich Werte für alle Felder durch Aufrufen ihrer Setter setzen, aber von wo ich diese Methode aufrufen, kann ich nicht alle Feldwerte erhalten.

Also, die Frage ist: Wie aktualisiere ich meine Realm-Datenbank in einer Weise, dass die vorhandenen Felder nicht null werden?

PS:

Mein Realm Version ist: 0.84.1, compile 'io.realm:realm-android:0.84.1'

+0

Nein sein, wenn ich die Werte einfügen, und das Protokoll macht es die Werte sicher richtig – OBX

+0

Durch die Art und Weise eingesetzt, Version '0.84.1' ist super, super alt. https://realm.io/docs/java/0.84.1/ –

+0

Welches ist die neueste Version? – OBX

Antwort

2

das Feld, das erwähnt werden aktualisiert wird, jedoch sind die Felder, die in diesem Verfahren nicht erwähnt werden, wird null oder null

Nun ja, alle Felder sind ihre Standardwerte an diesem Punkt.

ARDatabase db = new ARDatabase(); 

Haben Sie versucht, den aktuellen Datensatz abzufragen, dann die Felder zu aktualisieren und dann das Objekt zurückzusetzen?

Mit anderen Worten, Sie haben String uid, so etwas wie

private void downloadUpdateDatabase(String uid,String location_address) throws RealmException 
{ 
    mRealm.beginTransaction(); 
    ARDatabase db = mRealm.where(ARDatabase.class).equalTo("uid", uid).findFirst(); 
    db.setIsDownloaded(true); 
    db.setLocation(location_address); 
    mRealm.copyToRealmOrUpdate(db); 
    mRealm.commitTransaction(); 
} 

Oder probably better in async fashion.

private void downloadUpdateDatabase(final String uid, final String location_address) throws RealmException 
{ 
    mRealm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      ARDatabase db = realm.where(ARDatabase.class).equalTo("uid", uid).findFirst(); 
      db.setIsDownloaded(true); 
      db.setLocation(location_address); 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      // Transaction was a success. 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      // Transaction failed and was automatically canceled. 
     } 
    }); 
} 
+0

Würde es beheben, wenn ich 'db' global an erster Stelle erklären? – OBX

+0

Nein? Erstellen Sie eine 'neue ARDatabase();', alle Felder im 'RealmObject' sind ihre Standardwerte –

+0

So erstelle ich das Objekt und schreibe darauf: 'ARDatabase db = realm.createObject (ARDatabase.class);' . Also würde dies global machen und diese 'db' für Updates verwenden. Würde es Dinge reparieren? :/ – OBX

1

Statt

mRealm.beginTransaction(); 
ARDatabase db = new ARDatabase(); 
db.setUid(uid); 
db.setIsDownloaded(true); 
db.setLocation(location_address); 
mRealm.copyToRealmOrUpdate(db); 
mRealm.commitTransaction(); 
Log.e("TAG","DOWNLOAD UPDATE COMPLETED"); 

Es sollte

mRealm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     ARDatabase db = realm.where(ARDatabase.class).equalTo("uid", uid).findFirst(); 
     if(db == null) { 
      db = realm.createObject(ARDatabase.class, uid); 
     } 
     db.setIsDownloaded(true); 
     db.setLocation(location_address); 
    } 
}); 
Log.e("TAG","DOWNLOAD UPDATE COMPLETED"); 
Verwandte Themen