2017-01-21 5 views
0

これは私のレルムデータベースの構造です:Realmデータベースを更新する正しい方法は?

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

そして私は、データベースに正常にオブジェクトを追加することができます。
オブジェクトを更新する必要があるときに問題が発生します。

これは私が試したものです:

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

} 

私は、このメソッドを呼び出したときに、ここで問題があります。上記のフィールドは更新されますが、このメソッドでは指定されていないフィールドはnullまたはゼロになります。
もちろん、私はこのメソッドを呼び出す場所から、すべてのフィールド値を取得することはできませんが、それらのセッターを呼び出すことによってすべてのフィールドの値を設定することができます。

したがって、質問はです:既存のフィールドがnullにならないようにレルムデータベースを更新するにはどうすればよいですか?

PS:

マイレルムのバージョンがある:0.84.1、compile 'io.realm:realm-android:0.84.1'

+0

いいえ、私は値を挿入し、ログが値が正しくところで – OBX

+0

を挿入されていることが特定ます、バージョンがあるはずです'0.84.1'はsuper、super oldです。 https://realm.io/docs/java/0.84.1/ –

+0

最新のバージョンですか? – OBX

答えて

2

記載されているフィールドが更新されるが、しかし、この方法では言及されていないフィールドはnullになり、またはゼロ

はい、すべてのフィールドはこの時点でのデフォルトです。

ARDatabase db = new ARDatabase(); 

現在のレコードを照会してフィールドを更新し、そのオブジェクトを元に戻しましたか?言い換えれば

、あなたはString uidを持っているので、

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

あるいは、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

最初に 'db'グローバルを宣言すると修正されますか? – OBX

+0

いいえ? '新しいARDatabase();'を作ると、 'RealmObject'の全てのフィールドはデフォルト値です –

+0

これは私が最初にオブジェクトを作成してそれに書き込む方法です:' ARDatabase db = realm.createObject(ARDatabase.class); ' 。したがって、このグローバル化を行い、この 'db'を更新に使用します。それはものを修正するか? :/ – OBX

1

代わりの

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

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"); 
関連する問題