1. 程式人生 > >Realm資料庫使用教程(一):Realm配置和Stetho配置

Realm資料庫使用教程(一):Realm配置和Stetho配置

本人主要是開發android專案的,這裡只對android端Realm使用進行總結。

對於Realm的優缺點,既然你要使用了,就說明你有一定的瞭解,在這裡就不介紹了!如果需要可自行google

  • 資料庫效率對比

分別採用greendao、ormlite、realm三種資料框架對同一資料結構Note進行10000次和1000次的增、查、刪操作,對比其各自的執行效率,其執行速度對比具體如下表所示(時間單位為毫秒):

這裡寫圖片描述

上面資料僅表示在增、查、刪操作時執行速度的快慢,其他效能、功能、未做對比,對比結果顯著,不做詳細贅。

  • 引入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'
  • 初始化
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.
 * <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();
        }
    }

然後檢視資料庫,如下圖:

這裡寫圖片描述

到此Realm配置和Stetho配置基本完成,是否對你有所幫助呢?增刪改查請看後續文章。