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

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

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

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

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

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

数据来自: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支持的方法:

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

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

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

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

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

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

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.
 * <p>
 * 直接继承于RealmObject来声明 Realm 数据模型
 * <p>
 * 注意:如果你创建Model并运行过,然后修改了Model。
 * 那么就需要升级数据库,否则会抛异常。
 */

public class User extends RealmObject  {
    /**
     * 表示该字段是主键
     * <p>
     * 字段类型必须是字符串(String)或整数(byte,short,int或long)
     * 以及它们的包装类型(Byte,Short, Integer, 或 Long)。不可以存在多个主键,
     * 使用字符串字段作为主键意味着字段被索引(注释@PrimaryKey隐式地设置注释@Index)。
     */
    @PrimaryKey
    private int id;
    /**
     * 表示该字段非空
     * <p>
     * 只能用于Boolean, Byte, Short, Integer, Long, Float, Double, String, byte[] 和 Date。
     * 在其它类型属性上使用 @Required修饰会导致编译失败
     * <p>
     * 注意:基本数据类型不需要使用注解 @Required,因为他们本身就不可为空。
     */
    @Required
    private String name;
    private int age;
    /**
     * 表示忽略该字段
     * <p>
     * 被添加@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.
 * <p>
 * 通过实现 RealmModel接口并添加 @RealmClass修饰符来声明
 * <p>
 * 注意:如果你创建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();
    }
}

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值