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

先附上官方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的时候,发现一个方面:

  • 进行查询课程类的时候,会发现在学生类插入学生记录时,如果学生信息包含课程的话,自动会将课程记录插入到课程类中,其实想想应该也必然是这样!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值