在app的gradle裏面添加如下依賴
def room_version = "2.2.0"
implementation "androidx.room:room-runtime:$room_version"
// For Kotlin use kapt instead of annotationProcessor
annotationProcessor "androidx.room:room-compiler:$room_version"
// 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"
數據庫的三個要素:數據庫和表的創建,數據的訪問。我們就通過這三個要素來學習Room。
package com.example.jetpacktest;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//要想生成一張表,要添加註釋@Entity,表的名字默認是Student
// 如果想換表名,就要寫成我這樣的
@Entity(tableName = "AnHuiUniversityStudent")
public class Student {
@PrimaryKey(autoGenerate = true)
private int ID;//必須要有一個主鍵,自動增長設置爲true
@ColumnInfo(name = "anhuiUniversityStudentName")
private String name;//修改字段的名字可以用@ColumnInfo
@ColumnInfo(name = "anhuiUniversityStudentPWD")
private String password;
private int addressID;
//必須要有構造方法,插入數據的時候使用
// 沒有自動增長ID的構造方法
// 注意構造方法只能有一個
public Student(String name, String password, int addressID) {
this.name = name;
this.password = password;
this.addressID = addressID;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAddressID() {
return addressID;
}
public void setAddressID(int addressID) {
this.addressID = addressID;
}
@NonNull
@Override
public String toString() {
return getID() + " " + getName() + " " + getPassword() + " " + getAddressID();
}
}
package com.example.jetpacktest;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
/**
* 這就是數據訪問對象
* 用於操作數據的API
*/
@Dao//要添加這個註解
public interface StudentDao {
@Query("select * from AnHuiUniversityStudent")
List<Student> getAll();//執行這個方法就是執行註解中的SQL語句
@Insert//可以插入多個對象
void insert(Student... students);
@Delete
void delete(Student student);
@Update
void update(Student student);
}
package com.example.jetpacktest;
import androidx.room.Database;
import androidx.room.RoomDatabase;
/**
* 用來創建數據庫的類,必須寫成抽象類
*/
//註解entities表示哪些表屬於該數據庫
//註解version表示數據庫的版本
@Database(entities = {Student.class}, version = 1)
public abstract class MyDataBase extends RoomDatabase {
public abstract StudentDao userDao();
}
package com.example.jetpacktest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Database;
import androidx.room.Room;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseThread databaseThread = new DatabaseThread();
databaseThread.start();
}
//數據庫,網絡的操作都要在子線程
class DatabaseThread extends Thread {
@Override
public void run() {
super.run();
//在這裏進行數據庫的操作
MyDataBase zhang_xinDB = Room.databaseBuilder(getApplicationContext(),
MyDataBase.class
, "zhang_xinDB")//數據庫的名字,可以自己定義
.build();
StudentDao dao = zhang_xinDB.userDao();
dao.insert(new Student("安靜平","ajp",17));
List<Student> list = dao.getAll();
Log.i("zhang_xin",list.toString());
}
}
}
打印輸出
[1 安靜平 ajp 17]
以上只是小試牛刀,我們還有更加豐富的功能
一
@Entity(tableName = "AnHuiUniversityStudent")
public class Student {
@PrimaryKey(autoGenerate = true)
private int ID;
@ColumnInfo(name = "anhuiUniversityStudentName")
private String name;
@ColumnInfo(name = "anhuiUniversityStudentPWD")
private String password;
private int addressID;
//假設我們還有一個成員變量,但我們不想讓它成爲表的字段,我們可以這麼些
@Ignore
private String peiOu;
……其餘的略去
二
有條件查詢
package com.example.jetpacktest;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
/**
* 這就是數據訪問對象
* 用於操作數據的API
*/
@Dao//要添加這個註解
public interface StudentDao {
@Query("select * from AnHuiUniversityStudent")
List<Student> getAll();//執行這個方法就是執行註解中的SQL語句
@Insert//可以插入多個對象
void insert(Student... students);
@Delete
void delete(Student student);
@Update
void update(Student student);
//查詢一條記錄
@Query("select * from AnHuiUniversityStudent where addressID like :aid")
Student findByAddressID(int aid);
//查詢一組數據,用戶傳進一組ID
@Query("select * from AnHuiUniversityStudent where ID in (:userIDs)")
List<Student> getAllByID(int[] userIDs );
}
看MainActivity
package com.example.jetpacktest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Database;
import androidx.room.Room;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseThread databaseThread = new DatabaseThread();
databaseThread.start();
}
//數據庫,網絡的操作都要在子線程
class DatabaseThread extends Thread {
@Override
public void run() {
super.run();
//在這裏進行數據庫的操作
MyDataBase zhang_xinDB = Room.databaseBuilder(getApplicationContext(),
MyDataBase.class
, "zhang_xinDB")//數據庫的名字,可以自己定義
.build();
StudentDao dao = zhang_xinDB.userDao();
dao.insert(new Student("安靜平","ajp",17),new Student("王學崗","wxg",18));
List<Student> list = dao.getAll();
Log.i("zhang_xin",list.toString());
Log.i("zhang_xin",dao.findByAddressID(17)+"");
Log.i("zhang_xin",dao.getAllByID(new int[]{1,2})+"");
}
}
}
三 查詢結果只有一部分
加入我們只查詢name與password字段
新增加一個類
package com.example.jetpacktest;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
public class StudentTwo {
//與Student中的註解保持一致
@ColumnInfo(name = "anhuiUniversityStudentName")
private String name;
@ColumnInfo(name = "anhuiUniversityStudentPWD")
private String password;
public StudentTwo(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@NonNull
@Override
public String toString() {
return this.name+" "+this.password;
}
}
StudentDao中添加
//查詢結果只有一部分字段
@Query("select anhuiUniversityStudentName,anhuiUniversityStudentPWD from anhuiuniversitystudent")
List<StudentTwo> getTwoColumn();
MainActivity中調用
package com.example.jetpacktest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Database;
import androidx.room.Room;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseThread databaseThread = new DatabaseThread();
databaseThread.start();
}
//數據庫,網絡的操作都要在子線程
class DatabaseThread extends Thread {
@Override
public void run() {
super.run();
//在這裏進行數據庫的操作
MyDataBase zhang_xinDB = Room.databaseBuilder(getApplicationContext(),
MyDataBase.class
, "zhang_xinDB")//數據庫的名字,可以自己定義
.build();
StudentDao dao = zhang_xinDB.userDao();
dao.insert(new Student("安靜平","ajp",17),new Student("王學崗","wxg",18));
Log.i("zhang_xin",dao.getTwoColumn().toString());
}
}
}
四表和表之間建立聯繫
創建一張表,使該表的主鍵作爲Student的外鍵
package com.example.jetpacktest;
import androidx.annotation.NonNull;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;
@Entity(foreignKeys = @ForeignKey(entity = Students.class,parentColumns = "ID",childColumns = "addressID"))
public class Address {
@PrimaryKey(autoGenerate = true)//每一個類都需要一個主鍵
private int addressID;
private String addressName;
public Address(int addressID, String addressName) {
this.addressID = addressID;
this.addressName = addressName;
}
public int getAddressID() {
return addressID;
}
public void setAddressID(int addressID) {
this.addressID = addressID;
}
public String getAddressName() {
return addressName;
}
public void setAddressName(String addressName) {
this.addressName = addressName;
}
@NonNull
@Override
public String toString() {
return this.addressName+" "+this.addressID;
}
}
數據庫的遷移
版本名字改爲2
package com.example.jetpacktest;
import androidx.room.Database;
import androidx.room.RoomDatabase;
/**
* 用來創建數據庫的類,必須寫成抽象類
*/
//註解entities表示哪些表屬於該數據庫
//註解version表示數據庫的版本
@Database(entities = {Students.class,Address.class}, version = 2)
public abstract class MyDataBase extends RoomDatabase {
public abstract StudentDao userDao();
}
//更新數據庫,並遷移
final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//升級的代碼
Log.i("zhang_xin","數據庫版本升級1");
}
};
final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//升級的代碼
Log.i("zhang_xin","數據庫版本升級12");
}
};
final Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//升級的代碼
Log.i("zhang_xin","數據庫版本升級3");
}
};
MyDataBase myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "myDB").addMigrations(MIGRATION_1_2).
fallbackToDestructiveMigration().build();
StudentDao dao= myDataBase.userDao();
dao.insert(new Students("c","a",12));
Log.i("zhang_xin", dao.getTwoColumn().toString());
內嵌對象
class Address {
public String street;
public String state;
public String city;
@ColumnInfo(name = "post_code")
public int postCode;
}
@Entity
class User {
@PrimaryKey
public int id;
public String firstName;
@Embedded
public Address address;
}
關聯RxJava、LiveData和Cursor
//這裏就可以在以後用觀查者監聽到獲取的數據在數據表中對應數據的更
@Query("select name,pwd from Student")
public LiveData<List<StudentTuple>> getRecord2();
//支持RXjava
@Query("select name,pwd from Student")
public Flowable<List<StudentTuple>> getRecord3();
//支持Cursor
@Query("select name,pwd from Student")
public Cursor getRecord4();