Realm数据库使用教程(一):Realm配置和Stetho配置

本人主要是开发android项目的,这里只对android端Realm使用进行总结。

对于Realm的优缺点,既然你要使用了,就说明你有一定的了解,在这里就不介绍了!如果需要可自行google

Realm官方文档:https://realm.io/docs/java/latest/

  • 数据库效率对比

分别采用greendao、ormlite、realm三种数据框架对同一数据结构Note进行10000次和1000次的增、查、删操作,对比其各自的运行效率,其运行速度对比具体如下表所示(时间单位为毫秒):

Realm数据库使用教程(一):Realm配置和Stetho配置_第1张图片

上面数据仅表示在增、查、删操作时运行速度的快慢,其他性能、功能、未做对比,对比结果显著,不做详细赘。

数据来自:GreenDao、Ormlite、Realm性能对比

  • 引入Realm
在你项目的build.gradle中:

  dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta6'
//        classpath "io.realm:realm-gradle-plugin:4.3.1"
        //stetho_realm不支持高版本,这里使用3.0.0
        classpath "io.realm:realm-gradle-plugin:3.0.0"
    }

在你app的build.gradle中:

   apply plugin: 'realm-android'

realm的官方最新版本为4.3.1,但是为了兼容stetho我将版本更改为3.0.0

  • 引入stetho
在你项目的build.gradle中:

repositories {
    maven {
        url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
    }
}

在你app的build.gradle中:

compile 'com.facebook.stetho:stetho:1.5.0'
compile 'com.uphyca:stetho_realm:2.1.0'

stetho_realm的github地址:https://github.com/uPhyca/stetho-realm

  • 初始化
package tsou.com.simple.realmtest;

import android.app.Application;
import android.content.Context;

import com.facebook.stetho.Stetho;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider;

import java.security.SecureRandom;

import io.realm.Realm;
import io.realm.RealmConfiguration;
import tsou.com.simple.realmtest.migration.CustomMigration;
import tsou.com.simple.realmtest.utils.UIUtils;

/**
 * Created by Administrator on 2017/12/15 0015.
 */

public class MyApplication extends Application {

    /**
     * 上下文
     */
    private static MyApplication instance;
    private static RealmConfiguration config;
    private static String key = "huangxiaoguo1234";

    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * 在Realm中Stetho需要配置
         */
        Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
                        .build());

        Realm.init(this);
        instance = this;
        new SecureRandom().nextBytes(UIUtils.getRealmKey(key));
        config = new RealmConfiguration.Builder()
                .name("huangxiaoguo.realm")//指定数据库的名称。如不指定默认名为default。
                .schemaVersion(0)
                .deleteRealmIfMigrationNeeded()//声明版本冲突时自动删除原数据库,开发时候打开
//                .inMemory()// 声明数据库只在内存中持久化
                .build();
    }

    public static Context getInstance() {
        return instance;
    }

    public static RealmConfiguration getRealmConfiguration() {
        return config;
    }

}

RealmConfiguration支持的方法:

  1. Builder.name : 指定数据库的名称。如不指定默认名为default。

  2. Builder.schemaVersion : 指定数据库的版本号。

  3. Builder.encryptionKey : 指定数据库的密钥。

  4. Builder.migration : 指定迁移操作的迁移类。

  5. Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。

  6. Builder.inMemory : 声明数据库只在内存中持久化。

  7. build : 完成配置构建。


  • 得到Realm对象,打开数据库操作
package tsou.com.simple.realmtest.utils;

import android.content.Context;
import android.content.res.AssetManager;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import io.realm.Realm;
import tsou.com.simple.realmtest.MyApplication;


public class UIUtils {

    private static Toast toast;

    /**
     * 静态吐司
     *
     * @param context
     * @param text
     */
    public static void showToast(Context context, String text) {
        if (toast == null) {
            toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
        }
        toast.setText(text);
        toast.show();
    }

    /**
     * 不需要上下文对象的  静态toast
     */
    public static void showToast(String text) {
        showToast(getContext(), text);
    }

    /**
     * 获取上下文对象
     *
     * @return
     */
    public static Context getContext() {
        return MyApplication.getInstance();
    }

    /**
     * 获得Realm实例
     *
     * @return
     */
    public static Realm getRealmInstance() {
        return Realm.getInstance(MyApplication.getRealmConfiguration());
    }

    /**
     * 获取Realm数据库64位秘钥
     *
     * @param key
     * @return
     */
    public static byte[] getRealmKey(String key) {
        String newKey = "";
        for (int i = 0; i < 4; i++) {
            newKey = newKey + key;
        }
        return newKey.getBytes();
    }

    /**
     * 从asset路径下读取对应文件转String输出
     *
     * @return
     */
    public static String getJson(String fileName) {
        StringBuilder sb = new StringBuilder();
        AssetManager am = getContext().getAssets();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(
                    am.open(fileName)));
            String next = "";
            while (null != (next = br.readLine())) {
                sb.append(next);
            }
        } catch (IOException e) {
            e.printStackTrace();
            sb.delete(0, sb.length());
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString().trim();
    }
}

在UIUtils工具类中getRealmInstance方法就是获得Realm实例的,其他的方法后期会用到。

  • 构建数据库model

    方式一:继承RealmObject

package tsou.com.simple.realmtest.bean;

import java.io.Serializable;

import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;

/**
 * Created by Administrator on 2017/12/15 0015.
 * 

* 直接继承于RealmObject来声明 Realm 数据模型 *

* 注意:如果你创建Model并运行过,然后修改了Model。 * 那么就需要升级数据库,否则会抛异常。 */ public class User extends RealmObject { /** * 表示该字段是主键 *

* 字段类型必须是字符串(String)或整数(byte,short,int或long) * 以及它们的包装类型(Byte,Short, Integer, 或 Long)。不可以存在多个主键, * 使用字符串字段作为主键意味着字段被索引(注释@PrimaryKey隐式地设置注释@Index)。 */ @PrimaryKey private int id; /** * 表示该字段非空 *

* 只能用于Boolean, Byte, Short, Integer, Long, Float, Double, String, byte[] 和 Date。 * 在其它类型属性上使用 @Required修饰会导致编译失败 *

* 注意:基本数据类型不需要使用注解 @Required,因为他们本身就不可为空。 */ @Required private String name; private int age; /** * 表示忽略该字段 *

* 被添加@Ignore标签后,存储数据时会忽略该字段。 */ @Ignore private String sex; public int getId() { return id; } public void setId(int 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }

支持的属性
boolean, byte, short,int,long,float, double,String,

Date 和,byte[], RealmObject,

RealmList< “?” extends RealmObject>

还支持Boolean, Byte, Short, Integer, Long, Float 和 Double

整数类型 short、int 和 long 都被映射到 Realm 内的相同类型(实际上为 long )

方式二:实现 RealmModel接口并添加 @RealmClass修饰符来声明。

package tsou.com.simple.realmtest.bean;

import io.realm.RealmModel;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;

/**
 * Created by Administrator on 2017/12/15 0015.
 * 

* 通过实现 RealmModel接口并添加 @RealmClass修饰符来声明 *

* 注意:如果你创建Model并运行过,然后修改了Model。 * 那么就需要升级数据库,否则会抛异常。 */ @RealmClass public class Student implements RealmModel { private String name; private int num; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }

  • 在Chrome上查看数据库

打开数据库

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRealm = UIUtils.getRealmInstance();
        initView();

    }

关闭数据库
Activity中用完记得关闭

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mRealm != null && !mRealm.isClosed()) {
            mRealm.close();
        }
    }

然后查看数据库,如下图:

Realm数据库使用教程(一):Realm配置和Stetho配置_第2张图片

Stetho的详细配置,请查看:使用Stetho在Chrome上直接调试android应用数据库&Okhttp网络请求

到此Realm配置和Stetho配置基本完成,是否对你有所帮助呢?增删改查请看后续文章。

Realm数据库使用教程(二):增加数据

Demo地址:https://gitee.com/huangxiaoguo/Realm

你可能感兴趣的:(android-数据库)