Realm数据库使用

介绍

Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库。

相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持

使用方法

1. 添加Realm到工程

要在安卓工程中使用Realm,你需要在module的build.gradle文件中添加一个添加一个依赖:

compile 'io.realm:realm-android:0.84.1'

2. 创建一个Realm

一个Realm相当于一个SQLite数据库。它有一个与之对应的文件,一旦创建将持久保存在安卓的文件系统中,如下图所示:
这里写图片描述

要创建一个新的Realm,你可以在任意Activity中调用静态方法Realm.getInstance

Realm myRealm = Realm.getInstance(context);

注意,调用Realm.getInstance,而没有传入RealmConfiguration,会创建一个叫做 default.realm的Realm文件。

如果你想向app中添加另一个Realm,必须使用一个RealmConfiguration.Builder对象,并为 Realm file 指定一个独有的名字。

Realm myOtherRealm =
        Realm.getInstance(
                new RealmConfiguration.Builder(context)
                        .name("myOtherRealm.realm")
                        .build()
);

3. 创建一个RealmObject

只要继承了RealmObject类,任意JavaBean都能存储在Realm中。不知道JavaBean是什么?它就是一个可序列化的java类,有默认构造器,成员变量有相应的getter/setter方法。比如,下面这个类的实例就能轻松的存储在一个Realm中:

public class User extends RealmObject{
    @PrimaryKey
    private int id;
    private String UserName;
    private Double score;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return UserName;
    }

    public void setUserName(String userName) {
        UserName = userName;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }
}

如果你想让RealmObject的一个成员变量作为主键,你可以使用@PrimaryKey注解。比如,上面为User类添加一个主键id

4. 创建transaction

虽然从一个Realm读取数据非常简单(下一节有讲),但是向它写入数据就稍微复杂一点。Realm遵循 ACID (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。

要开始一个新的事务,使用beginTransaction方法。类似地,要结束这个事务,使用commitTransaction方法。

User user = new User();
user.setId(Integer.parseInt(getTxtId().getText() + ""));
user.setUserName(getTxtUserName().getText() + "");
user.setScore(Double.parseDouble(getTxtScore().getText() + ""));
realm.beginTransaction();
realm.copyToRealmOrUpdate(user);
realm.commitTransaction();

5.Where查询

Realm为创建查询提供了一套非常直观和流式的API。要创建一个查询,使用相关Realm对象的where方法并传入你感兴趣的对象的类。创建完查询之后,你可以使用返回一个RealmResults对象的findAll方法获取所有的结果,findAll。在下面的例子中,我们获取并打印Country的所有对象:

RealmResults<Country> results1 =
        myRealm.where(Country.class).findAll();

for(Country c:results1) {
    Log.d("results1", c.getName());
}

// Prints Norway, Russia

Realm提供了几个命名非常贴切的方法,比如beginsWith, endsWith,lesserThan 和 greaterThan,可以用来过滤,筛选结果。下面的代码演示了如何使用greaterThan方法来获取population(人口)大于1亿的Countryobjects:

RealmResults<Country> results2 =
        myRealm.where(Country.class)
                .greaterThan("population", 100000000)
                .findAll();

// Gets only Russia

如果你想查询结果被归类,你可以使用findAllSorted方法。在它的参数中,用一个String指定被归类field的名字,并用一个boolean指定归类顺序。

// Sort by name, in descending order
RealmResults<Country> results3 =
        myRealm.where(Country.class)
                .findAllSorted("name", false);

// Gets Russia, Norway

Demo

DBUtils.java

public class DBUtils{
    private volatile static DBUtils uniqueInstance;

    public static DBUtils getInstance() {
        if (uniqueInstance == null) {
            synchronized (DBUtils.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new DBUtils();
                }
            }
        }
        return uniqueInstance;
    }

    //新增,如果有主键且主键重复会报错
    public void save(Realm realm, RealmObject realmObject) {
        realm.beginTransaction();
        realm.copyToRealm(realmObject);
        realm.commitTransaction();
    }

    //新增或修改,如果主键不存在则为新增,主键存在则修改
    public void saveOrUpdate(Realm realm, RealmObject realmObject) {
        realm.beginTransaction();
        realm.copyToRealmOrUpdate(realmObject);
        realm.commitTransaction();
    }

    //批量保存或更新
    public <T extends RealmObject> void saveList(Realm realm, List<T> realmObjects) {
        realm.beginTransaction();
        realm.copyToRealmOrUpdate(realmObjects);
        realm.commitTransaction();
    }

    public <T extends RealmObject> T findFirst(Realm realm, Class<T> realmObjectClass) {
        return realm.where(realmObjectClass).findFirst();
    }

    public <T extends RealmObject> RealmResults<T> findAll(Realm realm, Class<T> realmObjectClass) {
        return realm.where(realmObjectClass).findAll();
    }

    //过滤查找第一个
    public <T extends RealmObject> T findFirstByField(Realm realm, String FiledName, String FieldValue, Class<T> realmObjectClass) {
        return realm.where(realmObjectClass).equalTo(FiledName, FieldValue).findFirst();
    }

    //过滤查找所有
    public <T extends RealmObject> RealmResults<T> findAllByField(Realm realm, String FiledName, String FieldValue, Class<T> realmObjectClass) {
        return realm.where(realmObjectClass).equalTo(FiledName, FieldValue).findAll();
    }

    //排序
    public <T extends RealmObject> RealmResults<T> findAllDateSorted(Realm realm, String FieldName, Class<T> realmObjectClass) {
        RealmResults<T> results = findAll(realm, realmObjectClass);
        results.sort(FieldName, Sort.DESCENDING);
        return results;
    }

    //删除所有数据
    public <T extends RealmObject> void clear(Realm realm, Class<T> realmObjectClass) {
        realm.beginTransaction();
        findAll(realm, realmObjectClass).clear();
        realm.commitTransaction();
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1">

    <ListView
        android:id="@+id/mylist"
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_weight="0.25"/>

    <LinearLayout
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/mylist"
        android:orientation="vertical">
    </LinearLayout>

    <TableLayout
        android:id="@+id/table"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/mylist">

        <TableRow>

            <TextView
                android:text="主键ID:"
                android:layout_weight="1"
                android:textSize="30sp"
                android:layout_width="0dp"
                android:layout_height="50dp"/>
            <EditText
                android:id="@+id/txtId"
                android:layout_width="0dp"
                android:layout_height="50dp"
                android:layout_weight="2"
                android:inputType="number"/>
        </TableRow>

        <TableRow>
            <TextView
                android:text="用户名:"
                android:layout_weight="1"
                android:textSize="30sp"
                android:layout_width="0dp"
                android:layout_height="50dp"/>
            <EditText
                android:id="@+id/txtUserName"
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="50dp"/>
        </TableRow>

        <TableRow>
            <TextView
                android:text="成绩:"
                android:layout_weight="1"
                android:textSize="30sp"
                android:layout_width="0dp"
                android:layout_height="50dp"/>
            <EditText
                android:id="@+id/txtScore"
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="50dp"
                android:inputType="numberDecimal"/>
        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="新增或修改"/>

            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="查询第一个"/>

            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="查询所有"/>

        </TableRow>

        <TableRow>

            <Button
                android:id="@+id/button4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="排序"/>

            <Button
                android:id="@+id/button5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="新增"/>

            <Button
                android:id="@+id/button6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="删除所有"/>

        </TableRow>
    </TableLayout>


</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView myList;
    private List<String> data;
    private ArrayAdapter<String> adapter;
    private Realm realm;

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                User user = new User();

                user.setId(Integer.parseInt(getTxtId().getText() + ""));
                user.setUserName(getTxtUserName().getText() + "");
                user.setScore(Double.parseDouble(getTxtScore().getText() + ""));
                DBUtils.getInstance().saveOrUpdate(realm, user);
                break;
            case R.id.button2:
                User user2 = DBUtils.getInstance().findFirst(realm, User.class);
                if (user2 != null) {
                    data.clear();
                    data.add(user2.getId() + "  " + user2.getUserName() + "  " + user2.getScore());
                    adapter.notifyDataSetChanged();
                }
                break;
            case R.id.button3:
                List<User> users = DBUtils.getInstance().findAll(realm, User.class);
                if (users !=null){
                    data.clear();
                    for(int i=0;i<users.size();i++){
                        User user3 = users.get(i);
                        data.add(user3.getId() + "  " + user3.getUserName() + "  " + user3.getScore());
                    }
                    adapter.notifyDataSetChanged();
                }
                break;
            case R.id.button4:
                RealmResults<User> users4 = DBUtils.getInstance().findAllDateSorted(realm, "score", User.class);
                if (users4 !=null){
                    data.clear();
                    for(int i=0;i<users4.size();i++){
                        User user3 = users4.get(i);
                        data.add(user3.getId() + "  " + user3.getUserName() + "  " + user3.getScore());
                    }
                    adapter.notifyDataSetChanged();
                }
                break;
            case R.id.button5:
                User user5 = new User();

                user5.setId(Integer.parseInt(getTxtId().getText() + ""));
                user5.setUserName(getTxtUserName().getText() + "");
                user5.setScore(Double.parseDouble(getTxtScore().getText() + ""));
                DBUtils.getInstance().save(realm, user5);
                break;
            case R.id.button6:
                DBUtils.getInstance().clear(realm, User.class);
                data.clear();
                adapter.notifyDataSetChanged();
                break;

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        realm = Realm.getInstance(this);

        findViewById(R.id.button).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        findViewById(R.id.button4).setOnClickListener(this);
        findViewById(R.id.button5).setOnClickListener(this);
        findViewById(R.id.button6).setOnClickListener(this);

        myList = (ListView) findViewById(R.id.mylist);
        data = new ArrayList<String>();
        data.add("Hello World");
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        myList.setAdapter(adapter);
    }

    private EditText getTxtId() {
        return (EditText) findViewById(R.id.txtId);
    }

    private EditText getTxtUserName() {
        return (EditText) findViewById(R.id.txtUserName);
    }

    private EditText getTxtScore() {
        return (EditText) findViewById(R.id.txtScore);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值