Realm 是一個手機數據庫,是用來替代 SQlite 的解決方案,比 SQlite 更輕量級,速度更快,因爲它有一套自己的數據庫搜索引擎,並且還具有很多現代數據庫的優點,支持 JSON,流式 API 調用,數據變更通知,自動數據同步,簡單身份驗證,訪問控制,事件處理,最重要的是跨平臺,目前已經支持 Java、Swift、Object - C、React - Native 等多種實現,今天我們就來簡單的入門 Ream 數據庫的使用
GitHub 地址:Realm GitHub 地址
官方文檔地址:官方文檔地址
一、使用要求
首先使用 Realm 的一些使用要求我們還是需要先來了解
- Android Studio 的使用版本必須在 1.5.1 或更高
- 使用 JDK 7 或更高版本
- Android API 9 或更高(即 Android 2.3 及以上)
- Realm 不在 Android 支持 Java,不支持 Eclipse 作爲 IDE,如果使用請轉到 Android Studio
上面基本就是我們要注意的事項,大家瞭解即可
二、環境配置
在瞭解 Realm 在 Andorid 中的基本使用要求之後,接下來我們來看看,如何在 Android Studio 中來引入 Realm
1)首先在工程的根目錄(工程目錄) build.gradle 中引入如下代碼,注意是工程的 build.gradle 而不是 app 的 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:3.7.0"
}
可以看到 Realm 是作爲一個插件來安裝的
添加位置如下圖:
2)在 app 的 build.gradle 中添加如下代碼
apply plugin: 'realm-android'
添加位置如下圖:
當上面的這兩步做好以後,可以刷新我們的 Gradle 依賴,如果你是通過 v 0.88 以前的版本來更新,你需要去清理一下你的 Gradle 項目(./gradlew clean),來移除之前的安裝,另外對 Maven 和 Ant 並不支持
三、官方推薦的例子
introExample:包括了簡單的例子,讓你知道如何去使用當前的 API
gridViewExample:一個簡單的 APP,來展示怎麼通過 Realm 來支持 GridView 的存儲,同時它還呈現瞭如何構建一個 JSON 的數據庫(通過 GSON)
thread Example :簡單展示如何在多線程中使用 Realm
adapterExample:如何通過使用 RealmBaseAdapter 和 RealmRecyclerViewAdapter 來使 Realm 以優雅的方式作用於 ListView 和 RecyclerView
jsonExample:如何使用一種新的 Realm JSON 工具
encryptionExample:如何使用加密 Realms
rxJavaExample:如何搭配 RxJava 來使用 Realm
UnitTestExample:教你在使用 Realm 時如何編寫單元測試
四、初始化 Realm
1)在 Applaction 的 onCreate() 方法中使用 Realm.init() 初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
}
}
2)在 Applaction 的 onCreate() 方法中對 Realm 進行相關的配置
1. 使用默認配置:
Realm.init(this);
Realm mRealm = Realm.getDefaultInstance();
或者如下:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// The default Realm file is "default.realm" in Context.getFilesDir();
// we'll change it to "myrealm.realm"
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().name("myrealm.realm").build();
Realm.setDefaultConfiguration(config);
}
}
使用默認配置會創建一個 default.realm 的 Realm 文件,一般來說這個文件位於 data/data/包名/files 目錄下,通過 realm.getPath 來獲得該 Realm 的絕對路徑
2. 使用自定義配置:
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myrealm.realm") //文件名
.schemaVersion(0) //版本號
.build();
Realm realm = Realm.getInstance(config);
3. 創建非持久化的 realm,也就是保存在內存中,應用關閉後就清除
RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
.name("myrealm.realm")//保存在內中
.inMemory()
.build();
RealmConfiguration 支持的方法:
Builder.name:指定數據庫的名稱,如果不指定默認爲 default
Builder.schemaVersion:指定數據庫的版本號
Builder.encryptionkey:指定數據庫的祕鑰
Builder.migration:指定遷移操作的遷移類
Builder.deleteRealmIfMigrationNeeded:聲明版本衝突時自動刪除原數據庫
Builder.inMemory:聲明數據庫只在內存中持久化
build:完成配置構建
如果你像以上一樣創建了自己的 Application,並初始化 Realm,那麼你需要在 Andorid.manifest.xml 中進行如下配置:
<application
android:name=".MyApplication"
...
/>
3)在 Activity 中具體的使用:
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Realm realm = Realm.getDefaultInstance(); // opens "myrealm.realm"
try {
// ... Do something ...
} finally {
realm.close();
}
}
}
或者使用完後在 onDestory() 方法中進行關閉:
@Override
protected void onDestroy() {
super.onDestroy();
// Close the Realm instance.
realm.close();
}
四、創建實體
創建一個 User 類,繼承 RealmObject
public class User extends RealmObject {
private String name;
private int age;
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;
}
}
這裏除了通過繼承 RealmObject 來聲明數據模型外,還可以通過實現 RealmModel 接口,並添加 @RealmClass 修飾符來聲明:
@RealmClass
public class User implements RealmModel {
...
}
多對多的關係:
public class User extends RealmObject {
public String name;
public RealmList<Email> emails;
}
public class Email extends RealmObject {
public String address;
public boolean active;
}
支持的屬性:
boolean、byte、short、int、long、float、double、String、Date、byte[]、RealmObject、RealmList<? extends RealmObject>,還支持 Boolean、Byte、Short、Integer、Long、Float 和 Double
@primarykey:表示該字段是主鍵,一般使用過數據庫的同學可能知道,primarykey 就是主鍵,使用 @primarykey 來標註字段類型必須是字符串(String)或整數(byte、short、int、long)以及它們的包裝類型(Byte、Short、Integer、Long),還需要注意的是不可以使用多個主鍵
@PrimaryKey
private String id;
@Required:表示該字段非空
在某些情況下,有些字段是不能爲 null 的,使用 @Required 屬性可以強行要求其屬性不能爲 null,只能用於 Boolean、Byte、Short、Integer、Long、Float、Double、String、byte[] 和 Date,在其他類型屬性上使用 @Required 會導致編譯失敗
@Required
private String name;
@Ignore:表示忽略該字段,添加 @Ignore 標籤後,存儲數據時會忽略該字段
@Ignore
private String name;
@Index:添加搜索索引,爲字段添加 @Index 標籤,插入速度變慢,查詢速度變快,支持索引 String、byte、short、int、long、boolean 和 Date字段
五、增
1) 實現方法一:事務操作
類型一:新建一個對象進行存儲
mRealm.beginTransaction();
User user = mRealm.createObject(User.class); // Create a new object
user.setName("John");
user.setEmail("[email protected]");
mRealm.commitTransaction();
類型二:複製一個對象到數據庫
User user = new User("John");
user.setEmail("[email protected]");
// Copy the object to Realm. Any further changes must happen on realmUser
mRealm.beginTransaction();
mRealm.copyToRealm(user);
mRealm.commitTransaction();
2) 實現方法二:使用事務塊
Realm mRealm=Realm.getDefaultInstance();
final User user = new User("John");
user.setEmail("[email protected]");
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(user);
}
});
六、刪
1) 使用 deleteFromRealm()
//先查找到數據
final RealmResults<User> userList = mRealm.where(User.class).findAll();
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
userList.get(0).deleteFromRealm();
}
});
2) 使用 deleteFromRealm(int index)
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
userList.deleteFromRealm(0);
}
});
3) 其他方法
userList.deleteFirstFromRealm(); //刪除user表的第一條數據
userList.deleteLastFromRealm();//刪除user表的最後一條數據
results.deleteAllFromRealm();//刪除user表的全部數據
七、改
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//先查找後得到User對象
User user = mRealm.where(User.class).findFirst();
user.setAge(26);
}
});
八、查
查詢的操作相對來說比較多,下面我們來一一介紹
1) findAll:查詢所有,如查詢所有 User
RealmResults<User> userList = mRealm.where(User.class).findAll();
2) findFirst:查詢第一條數據,示例如下
User user2 = mRealm.where(User.class).findFirst();
3) equalTo:根據條件查詢,例得到命名爲 qdj 的列表
RealmResults<User> userList = mRealm.where(User.class)
.equalTo("name", "qdj").findAll();
還有很多其他的方法如下:
sum():對指定字段求和
average():對指定字段求平均值
min():對指定字段求最小值
max():對指定字段求最大值
findAll():返回結果集所有字段
findAllSorted():排序返回結果集所有字段等等方法,還有很多,這裏不再一一列舉,用到時大家可以去官網查詢相關的 API
今天就寫到這裏,有錯誤請指正