Android Room的學習之基本使用

Room學習三部曲

Android Room的學習之基本使用
Android Room的學習之關聯表
Android Room的學習之數據庫升級

最近實際開發中有用到數據庫,所以就抽時間研究下 Room官方地址
  1. 簡介
    Room是一個對象關係映射(ORM)庫。
    Room抽象了SQLite的使用,可以在充分利用SQLite的同時訪問流暢的數據庫。
    在這裏插入圖片描述

  2. Room的組成
    Database
    Entity
    DAO
    Database:app持久化狀態,並作爲與應用持久關聯數據的底層連接的主要訪問點。
    使用Database註解的類需要滿足的條件:

    1. 集成RoomDatabase的抽象類
    2. 包含與數據庫相關聯的實體列表。
    3. 包含一個無參抽象方法並且返回的類需要用@Dao註解

    Entity:用來註解實體類,並利用該類的所有字段作爲表的列來創建表。
    Dao:提供訪問數據庫的方法。

使用:

1.添加依賴

   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
    api "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"

Android x 使用

    def room_version = "2.2.1"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation "androidx.room:room-ktx:$room_version"

    // optional - RxJava support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

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

    // Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

2.例子

創建實體類 - Student.java

@Entity
public class Student {

    @PrimaryKey(autoGenerate = true)
    public int sId;

    @ColumnInfo(name = "name")
    public String name;

    @ColumnInfo(name = "age")
    public int age;

    public int getId() {
        return sId;
    }

    public void setId(int sId) {
        this.sId = sId;
    }

    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;
    }
}

然後是StudentDao.java

@Dao
public interface StudentDao {

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

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

    @Query("SELECT * FROM Student WHERE age=:age")
    List<Student> getStudentByAge(int age);

    @Query("SELECT * FROM Student WHERE age=:age LIMIT :max")
    List<Student> getStudentByAge(int max, int... age);

    @Query("SELECT * FROM Student WHERE sId =:sId")
    Student getStudent(int sId);

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

    @Update
    void updateStudent(Student... users);

    @Delete
    void delete(Student user);

}

最後是 AppDatabase.java

@Database(entities = {Student.class}, version = 1,exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DB_NAME = "StudentDatabase.db";
    private static volatile AppDatabase instance;

    static synchronized AppDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static AppDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                AppDatabase.class,
                DB_NAME).build();
    }

    public abstract StudentDao  studentDao();
}

重點 重點 重點: 所有數據庫的操作都需要放在異步線程 最好與RxJava合用。

添加:

 StudentDao mStudentDao = AppDatabase.getInstance(this).studentDao();
 Student mStudent = new Student();
 mStudent.setId(id);
 mStudent.setAge(age);
 mStudent.setName(name);
 mStudentDao.insertAll(mStudent);

更新:

 StudentDao mStudentDao = AppDatabase.getInstance(this).studentDao();
 Student mStudent = new Student();
 mStudent.setId(1);
 mStudent.setAge(562);
 mStudent.setName("張三222");
 mStudentDao.updateStudent(mStudent);

刪除:

 StudentDao mStudentDao = AppDatabase.getInstance(this).studentDao();
 Student mStudent = new Student();
 mStudent.setId(1);
 mStudent.setAge(56);
 mStudent.setName("張三");
 mStudentDao.delete(mStudent);

查找:

 StudentDao mStudentDao = AppDatabase.getInstance(this).studentDao();
List<Student> list =  mStudentDao.getAll()//查找全部

Student mStudent =  mStudentDao.getStudent(7)//根據年齡查找 返回對象

List<Student> list = mStudentDao.getStudentByAge(60)//根據年齡查找 list

List<Student> list = mStudentDao.getStudentByAge(60, 70)//根據年齡區間 查找 list

至此,簡單的Room 數據庫就完成了

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