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支援的方法:
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();
}
}
然後檢視資料庫,如下圖:
到此Realm配置和Stetho配置基本完成,是否對你有所幫助呢?增刪改查請看後續文章。