Android 数据库DataBase realm基础使用

前言:

Android开发中,不可避免使用到数据库来记录必要数据,比如手机写教程存草稿,临时的标题、图片Uri、描述等写在数据库中,方便下次编辑,比如一些远程实时观测大数据,不能实时传送,需要搜集到设备中DataBase,后续通过服务保证上传完整性,或者一些离线操作app都需要大量的DataBase。

DataBase选取,GreenDao、realm等专门为移动端设计的数据库DataBase,至于性能各有优势,但是还是主流让我选择了realm,原因很简单,就是因为使用简单。

地址:

realm官网:https://realm.io/cn/docs/java/latest/#快速入门

realm git:https://github.com/realm/realm-java

真心建议看官网文档,git写的有点潦草。

集成:

AndroidStudio集成,由于不同版本集成不一样,请按照官网最新的集成文档来做:https://realm.io/cn/docs/java/latest/#安装

使用:

1、模式,realm整体采用单例模式,所以一次数据库操作,都是在一个线程中进行的,不可夸线程的读取操作数据,所以在使用时候尽量使用异步操作(尽管realm提供了同步和异步两种),这样对Androidx会很友好。

2、增删改查,一下增删改查都是建立在异步操作基础上。

3、Bean,realm操作的所有数据,都是你简历的Bean基本对象:

至于一些特殊的处理,比如不想某个字段被存储,则必须使用标签,标签使用参考官网文档。

/**
 * Course数据库
 *
 * 存储本地编辑中的Course数据
 * 采用realm
 *
 * 只存一条编辑中,提交以后清空此表,有多条也同时删除
 */
public class Course extends RealmObject {
    private String id; //唯一id(因为只能有一条数据,所以固定为CourseEditCurrent)
    private String title;//标题
    private String coverUriPath;//封面uriPath
    private String story;//故事
    private String sort;//分类

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCoverUriPath() {
        return coverUriPath;
    }

    public void setCoverUriPath(String coverUriPath) {
        this.coverUriPath = coverUriPath;
    }

    public String getStory() {
        return story;
    }

    public void setStory(String story) {
        this.story = story;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }
}

4、先初始化,后使用增删改查:

Realm.init(MainActivity.this);//初始化realm DataBase

5、增:

                //创建本地Course DataBase
                Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm bgRealm) {
                        Course course = bgRealm.createObject(Course.class);
                        course.setId(StaticUtil.DATA_BASE_COURSE_CURRENT_ID);
                        course.setTitle(et_title.getText().toString().trim());
                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        // Transaction was a success.

                        gotoNext();
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        // Transaction failed and was automatically canceled.
                        UiUtil.showToast(CourseNewOneActivity.this, "本地存储失败");
                    }
                });

6、查询和删出:

        //查询满足条件的
        final Realm realm = Realm.getDefaultInstance();
        courseDataBaseResults = realm.where(Course.class)
                .equalTo("id", StaticUtil.DATA_BASE_COURSE_CURRENT_ID)
                .findAll();

        LogUtil.d("DataBase", "Course result size:" + courseDataBaseResults.size());

        //删除必须在一个executeTransaction中执行
        realm.executeTransaction(new Realm.Transaction() {
               @Override
               public void execute(Realm realm) {
                    //删除单个参考官网
                    courseDataBaseResults.deleteAllFromRealm();//删除所有的
                    LogUtil.d("DataBase", "Course delete size:" + courseDataBaseResults.size());
                    }
                });
        }

7、改:

更新某个字段,或者增加一个字段比较特殊,由于realm使用的规则是实时同步规则,即设置值以后,不需要其它操作,数据库已经是最新数据了,十分方便(记得要在executeTransactionAsync中操作)。

        Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                Course course = bgRealm.where(Course.class).equalTo("id", StaticUtil.DATA_BASE_COURSE_CURRENT_ID).findFirst();
                course.setCoverUriPath(uriPath);
            }
        });

注意:

1、realm采用的是Bean对象操作数据,如果你的Bean对象中增加字段或者删除字段,以及把Title改成name,name初始化数据库就会报错,修改方法是把app删除重新安装,不过这样会造成本地数据丢失,切记谨慎操作,或者去数据库修改字段。

2、由于是单例模式,所以在executeTransactionAsync里面的操作,一定要用回调的Realm bgRealm,否则会报错不在一个线程中操作数据:
                //创建本地Course DataBase
                Realm.getDefaultInstance().executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm bgRealm) {
                        Course course = bgRealm.createObject(Course.class);
                        course.setId(StaticUtil.DATA_BASE_COURSE_CURRENT_ID);
                        course.setTitle(et_title.getText().toString().trim());
                    }
                },

3、使用单例操作Realm.getDefaultInstance()数据库之前一定要初始化,只用初始化一次即可Realm.init(MainActivity.this);//初始化realm DataBase。

你可能感兴趣的:(【,Android,进阶开发,】)