Android Realm数据库的使用

来源:互联网 发布:淘宝618活动报名 编辑:程序博客网 时间:2024/05/02 01:08

数据库在我们的开发过程中用的很多,从Android原生的Sqlite,到后来的ORMLite、GreenDao等数据库框架,数据库的效率要求越来越高,现在Realm正成为一款很火的高效轻量级框架。

先看Android环境下的配置

1.首先要在Project一级的build.gradle添加如下配置

buildscript {    repositories {        jcenter()    }    dependencies {        classpath 'com.android.tools.build:gradle:2.2.2'        //to use realm        classpath "io.realm:realm-gradle-plugin:2.2.1"        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}

2.在module一级的build.gradle添加如下配置

apply plugin: 'realm-android'

同步一下就OK了,先在Application初始化

public class App extends Application {  @Override  public void onCreate() {    super.onCreate();    //创建数据库 初始化配置    Realm.init(this);    //这里有很多配置 看自己需要了    RealmConfiguration conf = new RealmConfiguration.Builder()        .name("demo.realm")        .deleteRealmIfMigrationNeeded()        .schemaVersion(1)        .build();    Realm.setDefaultConfiguration(conf);  }}

首先写实体类

public class Student extends RealmObject implements Parcelable {  @PrimaryKey  private String id;  private String name;  private int age;  private int clazz;  public int getClazz() {    return clazz;  }  public void setClazz(int clazz) {    this.clazz = clazz;  }  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public Student(String id, String name, int age, int clazz) {    this.id = id;    this.name = name;    this.age = age;    this.clazz = clazz;  }  @Override  public String toString() {    return "Student{" +        "id='" + id + '\'' +        ", name='" + name + '\'' +        ", age=" + age +        '}';  }  @Override  public int describeContents() {    return 0;  }  @Override  public void writeToParcel(Parcel dest, int flags) {    dest.writeString(this.id);    dest.writeString(this.name);    dest.writeInt(this.age);    dest.writeInt(this.clazz);  }  public Student() {  }  protected Student(Parcel in) {    this.id = in.readString();    this.name = in.readString();    this.age = in.readInt();    this.clazz = in.readInt();  }  public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {    @Override    public Student createFromParcel(Parcel source) {      return new Student(source);    }    @Override    public Student[] newArray(int size) {      return new Student[size];    }  };}

这和我们一般的JavaBean没什么区别,只不过成员变量也是通过注解的方式来实现绑定。我记得之前的版本是不能实现序列化、不能有带参构造的,看来也是做了大量的更新,点个赞。

实体类的注解说明:

@PrimaryKey①字段必须是String、 integer、byteshortintlong 以及它们的封装类Byte, Short, Integer, and Long②使用了该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替。③使用了该注解将默认设置(@index)注解④使用了该注解之后,创建和更新数据将会慢一点,查询数据会快一点。@Required数据不能为null@Ignore忽略,即该字段不被存储到本地@Index为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。

Realm使得一对多、多对多变得更简单

public class Clazz extends RealmObject {  @PrimaryKey  public String id;  public String name;  //实现简单的一对多关系  public RealmList<Student> students;}

数据库最终要实现得就是增删改查(CRUD)

在界面oncreate()的时候初始化Realm

mRealm = Realm.getDefaultInstance();

1.增

①同步

//这里有两种方法,第一种:mRealm.beginTransaction();Student student =mRealm.createObject(Student.class,UUID.randomUUID().toString());student.setAge(1);student.setClazz(2);student.setName("Jack" );mRealm.commitTransaction();//第二种:mRealm.beginTransaction();Student s = new Student(UUID.randomUUID().toString(), "superman", 3, 1);mRealm.copyToRealm(s);mRealm.commitTransaction();

②异步

//插入数据    insertAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {      @Override      public void execute(Realm realm) {        //方法1        for (int i = 0; i < 100; i++) {          Student student = realm.createObject(Student.class, UUID.randomUUID().toString());          student.setAge(i);          student.setClazz((i % 2) + 1);          student.setName("student" + i);        }        //方法二        List<Student> list = new ArrayList<>();        for (int i = 0; i < 100; i++) {          Student s = new Student(UUID.randomUUID().toString(), "superman" + i, i, (i % 2) + 1);          list.add(s);        }        realm.copyToRealm(list);      }    }, new Realm.Transaction.OnSuccess() {      @Override      public void onSuccess() {        Toast.makeText(MainActivity.this, "Insert Success.", Toast.LENGTH_SHORT).show();      }    }, new Realm.Transaction.OnError() {      @Override      public void onError(Throwable error) {        Toast.makeText(MainActivity.this, "Insert Error.", Toast.LENGTH_SHORT).show();        error.printStackTrace();      }    });

这里异步返回是一个AnsycTask,需要在Activity或Fragment的OnDestroy()方法中,要取消这个异步任务(增删改查如果使用异步,都需要此步骤)

2.删(同步异步用法和增一样)

mRealm.beginTransaction();        RealmResults<Student> results = mRealm.where(Student.class).equalTo("clazz", 1).findAll();        results.deleteFirstFromRealm();//删除第一个        results.deleteAllFromRealm();//删除所有符合条件的        mRealm.commitTransaction();        //异步删除        deleteAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {          @Override          public void execute(Realm realm) {            //删除名字叫superman2的            Student s = realm.where(Student.class).equalTo("name", "superman2").findFirst();            s.deleteFromRealm();          }        }, new Realm.Transaction.OnSuccess() {          @Override          public void onSuccess() {            Toast.makeText(MainActivity.this, "Delete Success", Toast.LENGTH_SHORT).show();          }        }, new Realm.Transaction.OnError() {          @Override          public void onError(Throwable error) {            Toast.makeText(MainActivity.this, "Delete Failed", Toast.LENGTH_SHORT).show();            error.printStackTrace();          }        });

3.修改(同步异步用法和增一样)

//同步        mRealm.beginTransaction();        mRealm.where(Student.class).equalTo("name", "superman0").findFirst().setName("superHero");        mRealm.commitTransaction();        //异步        updateAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {          @Override          public void execute(Realm realm) {            Student s = realm.where(Student.class).equalTo("name", "superman0").findFirst();            if (s != null) {              s.setName("superHero");            }          }        }, new Realm.Transaction.OnSuccess() {          @Override          public void onSuccess() {            Toast.makeText(MainActivity.this, "Update Success", Toast.LENGTH_SHORT).show();          }        }, new Realm.Transaction.OnError() {          @Override          public void onError(Throwable error) {            Toast.makeText(MainActivity.this, "Update Failed", Toast.LENGTH_SHORT).show();          }        });

4.查询(同步异步用法和增一样)

List<Student> students = mRealm.where(Student.class).equalTo("clazz", 1).findAll();        if (!students.isEmpty())          Log.d(T, "查询到数据条目: " + students.size());

这里查询的条件有:

between(), greaterThan(), lessThan(), greaterThanOrEqualTo()&lessThanOrEqualTo()equalTo() & notEqualTo()contains(), beginsWith() & endsWith()isNull() & isNotNull()isEmpty() & isNotEmpty()//使用sort(param,Sort.DESCENDING)排序public List<Dog> queryAllDog() {   RealmResults<Student> results = mRealm.where(Student.class).findAll();    //升序排列    results =results .sort("age");    //降序排列    results =results .sort("age", Sort.DESCENDING);    return mRealm.copyFromRealm(results); }

最后,这里需要注意的是,realm对象在界面销毁的时候一定要关闭,否则会容易出现泄漏

@Override  protected void onDestroy() {    super.onDestroy();    if (insertAsyncTask != null && !insertAsyncTask.isCancelled()) {      insertAsyncTask.cancel();      insertAsyncTask = null;    }    if (deleteAsyncTask != null && !deleteAsyncTask.isCancelled()) {      deleteAsyncTask.cancel();      deleteAsyncTask = null;    }    if (updateAsyncTask != null && !updateAsyncTask.isCancelled()) {      updateAsyncTask.cancel();      updateAsyncTask = null;    }    if (mRealm != null && !mRealm.isClosed()) {      mRealm.close();      mRealm = null;    }  }

当然Realm还有很多特性,比如说支持JSON等,要深入的学习,还是看官方的介绍吧 https://github.com/realm/realm-java

0 0