Realm for Android 使用入門

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

今天就寫到這裏,有錯誤請指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章