您的位置:首页 > 移动开发 > Android开发

Android框架之路——Realm数据库使用

2017-01-25 14:27 676 查看

先附上官方Api:https://realm.io/docs/java/latest/

参照的一些博客教程:

Android Realm

Realm 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的时候,发现一个方面:

进行查询课程类的时候,会发现在学生类插入学生记录时,如果学生信息包含课程的话,自动会将课程记录插入到课程类中,其实想想应该也必然是这样!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息