先附上官方Api:https://realm.io/docs/java/latest/
参照的一些博客教程:
使用教程:
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的时候,发现一个方面:
- 进行查询课程类的时候,会发现在学生类插入学生记录时,如果学生信息包含课程的话,自动会将课程记录插入到课程类中,其实想想应该也必然是这样!