Room學習三部曲
Android Room的學習之基本使用
Android Room的學習之關聯表
Android Room的學習之數據庫升級
最近實際開發中有用到數據庫,所以就抽時間研究下 Room官方地址
-
簡介
Room是一個對象關係映射(ORM)庫。
Room抽象了SQLite的使用,可以在充分利用SQLite的同時訪問流暢的數據庫。
-
Room的組成
Database
Entity
DAO
Database:app持久化狀態,並作爲與應用持久關聯數據的底層連接的主要訪問點。
使用Database註解的類需要滿足的條件:- 集成RoomDatabase的抽象類
- 包含與數據庫相關聯的實體列表。
- 包含一個無參抽象方法並且返回的類需要用@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 數據庫就完成了