簡體   English   中英

更新Realm數據庫的正確方法?

[英]Correct way to update a Realm database?

這是我的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:

我的Realm版本是:0.84.1, compile 'io.realm:realm-android:0.84.1'

提到的字段將被更新,但是此方法中未提及的字段將變為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();
}

或者, 可能以異步方式更好

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

代替

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM