【问题标题】:Correct way to update a Realm database?更新领域数据库的正确方法?
【发布时间】:2017-01-21 07:13:21
【问题描述】:

这是我的 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");

}

这里的问题是当我调用这个方法时。提及的字段得到更新,但此方法中未提及的字段变为空或零。
当然,我可以通过调用它们的设置器来设置所有字段的值,但是从我调用此方法的地方,我无法获取所有字段值。

所以,问题是:如何更新我的领域数据库,以使现有字段不会变为空?

附:

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

【问题讨论】:

  • 不,当我插入值时,日志确定这些值已正确插入
  • 顺便说一句,0.84.1 版本超级超级老。 realm.io/docs/java/0.84.1
  • 哪个是最新版本?
  • 点击我提供的链接。单击大警告消息链接。阅读来自realm.io的最新文档
  • classpath "io.realm:realm-gradle-plugin:${currentVersion}" 甚至来自最新下载文件的 gradle 文件,这是指定版本的方式。如何通过这种方式获取最新版本:compile 'io.realm:realm-android:0.84.1'.

标签: java android database realm


【解决方案1】:

提到的字段被更新,但是在这个方法中没有提到的字段变为空或零

嗯,是的,此时所有字段都是它们的默认值。

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

【讨论】:

  • 如果我首先声明 db 全局会解决问题吗?
  • 没有?制作一个new ARDatabase();RealmObject中的所有字段都是它们的默认值
  • 这就是我最初创建对象并写入它的方式:ARDatabase db = realm.createObject(ARDatabase.class);。因此,将其设为全局并使用此db 进行更新。它会解决问题吗? : /
  • 如果您确实想要ARDatabase 的多条记录,我认为您不需要全局对象。我已经更新了我的建议
  • 新的编辑,现在有点混乱,如果您可以从问题中对downloadUpdateDatabase() 进行代码编辑,那就太好了。
【解决方案2】:

代替

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多