Android框架之路——Realm数据库使用
2017-01-25 14:27
676 查看
先附上官方Api:https://realm.io/docs/java/latest/
参照的一些博客教程:
Android RealmRealm for Android详细教程
使用教程:
1、 gradle配置
在图中选中的俩个build.gradle文件中配置classpath "io.realm:realm-gradle-plugin:2.0.2" apply plugin: 'realm-android
2、新建MyApplication继承Application类,用来进行对realm初始化
import android.app.Application; import android.util.Log; import io.realm.Realm; import io.realm.RealmConfiguration; /** * 初始化App * Created by Mr.sorrow on 2017/1/25. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Realm.init(this); String key = "1234567890abcxyz1234567890abcxyz1234567890abcxyz1234567890abcxyz"; RealmConfiguration configuration = new RealmConfiguration.Builder().name("test.realm") .encryptionKey(key.getBytes()).deleteRealmIfMigrationNeeded().build(); Realm.setDefaultConfiguration(configuration); Log.i("MyApplication","init realm success"); } }
在清单文件中配置Application的name属性:
<application android:name=".MyApplication" android:allowBackup="true" ... </application>
运行项目,发现打印出日志,配置成功!
01-25 14:02:26.960 3047-3047/? I/MyApplication: init realm success
3、案例介绍
一名学生拥有多门课程,现在对学生以及课程对应进行数据库的增删改查4、创建实体类(需继承RealmObject)
Student类继承自RealmObject类import io.realm.RealmList; import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; /** * 学生实体类 * Created by Mr.sorrow on 2017/1/25. */ public class Student extends RealmObject{ //主键 @PrimaryKey private String id; private String name; private int age; //一个学生对应多门课程 private RealmList<Lesson> lessons; 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 RealmList<Lesson> getLessons() { return lessons; } public void setLessons(RealmList<Lesson> lessons) { this.lessons = lessons; } }
主键的生成方式采用注解方式,这里搬运一下常见的注解:
支持的数据类型:
boolean, byte, short, int, long, float, double, String, Date and byte[]
@PrimaryKey
字段必须是String、 integer、byte、short、 int、long
使用该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替。该注解将默认设置@Index注解
@Required
表示该字段数据不能为null
@Ignore
忽略,即该字段不被存储到本地
@Index
为这个字段添加一个搜索引擎,随着数据越多插入数据就越慢,但是查询会很快,类似数据库的索引,建议在需要优化查询速度的时候使用。
Lesson类继承自RealmObject类
import io.realm.RealmObject; /** * 课程实体类 * Created by Mr.sorrow on 2017/1/25. */ public class Lesson extends RealmObject{ //课程号 private String id; //课程名称 private String name; //课程节数 private int number; 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 getNumber() { return number; } public void setNumber(int number) { this.number = number; } @Override public String toString() { return id+","+name+","+number; } }
5、学生、课程的增删改查
1.创建布局文件<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/bt_1" android:text="增(使用事务操作)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_2" android:text="增(使用事务块)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/bt_3" android:text="删(使用事务操作)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_4" android:text="删(使用事务块)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/bt_5" android:text="改(使用事务操作)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_6" android:text="改(使用事务块)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/bt_7" android:text="查(查询全部)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_8" android:text="查(条件查询)" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <Button android:id="@+id/bt_9" android:text="增" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_10" android:text="删" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_11" android:text="改" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bt_12" android:text="查" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
2.学生CURD
//添加学生 mBt_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); //开启事务 realm.beginTransaction(); //实体类以及主键的值 Student stu = realm.createObject(Student.class, "1"); stu.setName("小明"); stu.setAge(10); //添加课程 Lesson lesson = new Lesson(); lesson.setName("数学"); lesson.setId("07270001"); lesson.setNumber(8); stu.getLessons().add(lesson); //提交事务 realm.commitTransaction(); } }); mBt_2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); final Student stu = new Student(); stu.setId("2"); stu.setName("小花"); stu.setAge(9); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.copyToRealm(stu); } }); } //删除学生 mBt_3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); realm.beginTransaction(); Student student = realm.where(Student.class).equalTo("name", "小明").findFirst(); student.deleteFromRealm(); realm.commitTransaction(); } }); mBt_4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { Student student = realm.where(Student.class).equalTo("id", "2").findFirst(); student.deleteFromRealm(); } }); } }); //更改学生信息 mBt_5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); Student student = realm.where(Student.class).equalTo("name", "小明").findFirst(); realm.beginTransaction(); student.setAge(20); realm.commitTransaction(); } }); mBt_6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); final Student student = realm.where(Student.class).equalTo("id", "2").findFirst(); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { student.setName("小美"); } }); } }); //查询学生记录 mBt_7.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); RealmResults<Student> result = realm.where(Student.class).findAll(); List<Student> stuList = realm.copyFromRealm(result); //打印日志 for (int i = 0;i < stuList.size(); i++ ) { Student stu = stuList.get(i); Log.i(tag, stu.getId() + "," + stu.getName() + "," + stu.getAge()); if(stu.getLessons().size()!=0){ for (Lesson lesson : stu.getLessons()) { Log.i(tag, lesson.toString()); } } } } }); mBt_8.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); Student student = realm.where(Student.class).equalTo("id", "1").findFirst(); //打印日志 Log.i(tag, student.getId() + "," + student.getName() + "," + student.getAge()); if(student.getLessons().size()!=0){ Log.i(tag, student.getLessons().toString()); } } });
搬运常用的查询的条件:
between(), greaterThan(), lessThan(), greaterThanOrEqualTo() 与 lessThanOrEqualTo()
equalTo() 与 notEqualTo()
contains()、beginsWith() 与 endsWith()
isNull() 与 isNotNull()
isEmpty() 与 isNotEmpty()
3.课程CURD
//异步添加 mBt_9.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); mAddTask = realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { Lesson lesson = new Lesson(); lesson.setId("08080001"); lesson.setName("音乐"); lesson.setNumber(2); realm.copyToRealm(lesson); } }, new Realm.Transaction.OnSuccess(){ @Override public void onSuccess() { Log.i(tag, "Async add success"); } }, new Realm.Transaction.OnError(){ @Override public void onError(Throwable error) { Log.i(tag, "Async add failed"); } }); } }); //异步删除 mBt_10.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); mDeleTask = realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { Lesson lesson = realm.where(Lesson.class).equalTo("name", "音乐").findFirst(); lesson.deleteFromRealm(); } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { Log.i(tag, "Async dele success"); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { Log.i(tag, "Async dele failed"); } }); } }); //异步更改 mBt_11.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Realm realm = Realm.getDefaultInstance(); mUpdateTask = realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { Lesson lesson = realm.where(Lesson.class).equalTo("name", "音乐").findFirst(); lesson.setNumber(4); } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { Log.i(tag, "Async update success"); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { Log.i(tag, "Async update failed"); } }); } }); //异步查询 mBt_12.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Realm realm = Realm.getDefaultInstance(); final RealmResults<Lesson> lessons = realm.where(Lesson.class).findAllAsync(); lessons.addChangeListener(new RealmChangeListener() { @Override public void onChange(Object element) { List<Lesson> lessonList = realm.copyFromRealm(lessons); if (lessonList.size() != 0) { for (Lesson lesson : lessonList) { Log.i(tag, lesson.toString()); } } } }); } });
最后记得在Activity的onDestroy中close和取消掉异步任务:
@Override protected void onDestroy() { super.onDestroy(); if (mAddTask != null && !mAddTask.isCancelled()) { mAddTask.cancel(); } if (mDeleTask != null && !mDeleTask.isCancelled()) { mDeleTask.cancel(); } if (mUpdateTask != null && !mUpdateTask.isCancelled()) { mUpdateTask.cancel(); } }
这些就是最基本最基本的操作了,项目使用估计还会遇到问题。在做这个demo的时候,发现一个方面:
进行查询课程类的时候,会发现在学生类插入学生记录时,如果学生信息包含课程的话,自动会将课程记录插入到课程类中,其实想想应该也必然是这样!
相关文章推荐
- Android中数据库操作框架Realm介绍与使用
- 【Android】在Android上使用OrmLite数据库框架 之 基本用法
- Android使用OrmLite数据库框架 之 使用表配置文件
- 开源框架-ormlite-android数据库的使用
- Android数据库Realm学习(一)基本使用
- Android 数据库框架OrmLite的使用(二)
- 【Android】在Android上使用OrmLite数据库框架 之 使用表配置文件
- Android 数据库框架ormlite 使用精要
- 使用android快速开发框架afinal的FinalDb操作android数据库
- Android数据库LitePal框架学习笔记(1)---数据库的adb操作以及LitePal使用入门
- Android数据库框架-Archiver(LiteOrm)的使用
- 使用android快速开发框架afinal的FinalDb操作android数据库
- 使用android快速开发框架afinal的FinalDb操作android数据库
- Android GreenDao数据库框架使用
- 【Android】在Android上使用OrmLite数据库框架 之 使用表配置文件
- Android使用OrmLite数据库框架 之 基本用法
- 使用android快速开发框架afinal的FinalDb操作android数据库
- 【Android 】Litepal 数据库框架使用
- Android 数据库框架OrmLite的使用(一)
- android 数据库操作使用ormlite框架1