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、byte、short、 int、long 以及它们的封装类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
- Android Realm数据库的使用
- Android Realm数据库使用
- Realm 数据库的使用(iOS &Android)
- 数据库Realm的使用
- android realm数据库基本使用
- Android-->Realm数据库使用注意事项
- android之Realm数据库使用
- Android realm数据库使用笔记
- Android数据库Realm的第一次
- Realm 数据库的简单使用
- Realm数据库的简单使用
- IOS Realm数据库的使用
- 关于Android数据库—realm的使用及理解
- 在android中使用Realm数据库框架
- 如何在Android中使用Realm数据库
- Realm移动应用数据库使用-Android
- Android Realm数据库的查询及自动更新
- Realm数据库框架的使用例子
- ZooKeeper的安装与部署
- 步进电机5种驱动方法的利弊详细分析
- unp抄书
- scrapy 结合 BeautifulSoup
- TFS上新建团队项目
- Android Realm数据库的使用
- 4Sum II
- oj-15-E-将两个字符串连起来
- linux kernel各驱动的启动顺序
- LaunchServicesError error 0
- linux学习笔记--skill命令
- HTTP/HLS/RTMP超级负载测试工具 --待完善
- 使用 android-Ultra-Pull-To-Refresh 实现 WebView 下拉刷新
- 微信小程序发布