Android Room概述

說明:

大部分譯自Android Developers的Room官網指導文檔第一篇,小部分自己查閱資料和理解後加上。

原文地址:https://developer.android.com/training/data-storage/room/

定義:

Room 在SQLite上提供了一個抽象層,從而在操作SQLite的時候能夠流暢的訪問數據庫。

爲什麼要有Room:

如果能夠實現結構化數據的本地存儲,那麼對於App來說是一件意義非凡並且好處巨大的事情。

最常見的用圖就是緩存相關數據。通過這個方式,當設備無法連接到網絡時,用戶仍然能夠通過離線方式來瀏覽內容。當設備重新連接網絡後,所有內容會通過服務器同步進行變更。由於Room已經爲開發者考慮了以上的問題,因此我們強烈推薦使用Room來代替SQLite。然鵝,如果你一意孤行非要用的話,好吧我不攔你,自備梯子,直走右拐謝謝:Save Data Using SQLite.

構成 :

Room主要由三個組件構成:

@Database:包含了數據庫holder和一些服務,作爲app持久化狀態,關係型數據的底層連接的主要連接點。

使用@Database註解的類需要滿足以下條件:

  • 集成RoomDatabase的抽象類
  • 包含實體列表,並且通過註解和數據庫有所關聯
  • 包含一個無參抽象方法並且返回的類需要用@Dao註解

運行時,你可以通過 Room.databaseBuilder() 或者Room.inMemoryDatabaseBuilder()兩種方式來創建Database實例。

@Entity:用來註解實體類,@Database通過entities屬性引用被@Entitiy註解的類,並利用該類的所有字段作爲表的列明來創建表

@Dao:提供訪問數據庫的方法。

這三個組件之間的關係如下圖:

Snip20180707_20.png

使用:

接下來舉個小例子,包含了一個簡單的數據庫,裏面有一個實體和一個DAO:

1.添加依賴

Room依賴

dependencies { 

    def room_version = "1.1.1" 

    implementation "android.arch.persistence.room:runtime:$room_version" 
    annotationProcessor "android.arch.persistence.room:compiler:$room_version" 

    // optional - RxJava support for Room 
    implementation "android.arch.persistence.room:rxjava2:$room_version" 

    // optional - Guava support for Room, including Optional and ListenableFuture 
    implementation "android.arch.persistence.room:guava:$room_version" 

    // Test helpers 
    testImplementation "android.arch.persistence.room:testing:$room_version" 
}

注意:這個是Room官方文檔的依賴項,其中optional的可以不加,因爲暫時不需要Rxjava。

2.開始正式體驗Room

首先創建實體類 - User.java

@Entity
public class User { 

    @PrimaryKey 
    private int uid; 

    @ColumnInfo(name = "first_name") 
    private String firstName; 

    @ColumnInfo(name = "last_name") 
    private String lastName; 

    // Getters and setters are ignored for brevity, 
    // but they're required for Room to work. 
}

然後是Dao - UserDao.java

@Dao
public interface UserDao { 

    @Query("SELECT * FROM user") 
    List<User> getAll(); 

    @Query("SELECT * FROM user WHERE uid IN (:userIds)") 
    List<User> loadAllByIds(int[] userIds); 

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " 
           + "last_name LIKE :last LIMIT 1") 
    User findByName(String first, String last); 

    @Insert 
    void insertAll(User... users); 

    @Delete 
    void delete(User user); 
}

最後是Database類 - AppDatabase.java

@Database(entities = {User.class}, version = 1) 
public abstract class AppDatabase extends RoomDatabase { 
    public abstract UserDao userDao(); 
}

創建完上面三個類,就可以通過下面這段代碼創建一個數據庫實例

AppDatabase db = Room.databaseBuilder(getApplicationContext(), 
        AppDatabase.class, "database-name").build(); 

個人總結:

這篇文章主要是介紹了room的組成部分以及簡單的使用方式。一句話總結就是,Entity用於建表,Dao用於CRUD,Database用於創建數據庫。

接下來我會把Room這一系列的文章都翻譯完,最後再通過一個小項目,達到理論實踐都掌握的程度,真正理解Room這個數據庫框架。

第二篇:Android Room Entity使用

第三篇:Android Room Dao使用

第四篇:Android Room遷移數據庫

第五篇:Android Room測試數據庫

第六篇:Android Room引用複雜數據

第七篇:Android Room實戰

最後,這是我第一次翻譯外文技術文章,肯定會有詞不達意或者錯誤的地方,希望大家批評指正,共同進步。

參考:

Android Room with a View

Android Persistence codelab

Android Architecture Components samples

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