1.先做資料庫Entity(Table) 的class
2.再做資料庫的Dao,利用第一步做的Entity(Table)進行增刪查改等...SQL行為
3.最後建立Database物件管理眾多的 Dao 物件
Entity(Table)
@Entity代表此類別為一個table,一個資料表一定要有一個Primary key,用@PrimaryKey表示。
@NonNull表示該欄位值不可為空值
若加上@ColumnInofo表示為該欄位取名
@Entity
public class Expense {
//要設計主key
@PrimaryKey(autoGenerate = true) //自動產生
int id;
@NonNull
@ColumnInfo(name = "onCreate")
String date;
@NonNull
String info;
@NonNull
int amount;
public Expense(@NonNull String date, @NonNull String info, int amount) {
this.date = date;
this.info = info;
this.amount = amount;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
..............
}
Dao
負責處理所有對資料庫資料進行增刪查改的行為
@Insert表示新增資料
@Query表示查詢資料
@Delete表示刪除資料
@Update表示更新資料
@Dao //紀錄怎麼存取資料庫
public interface ExpenseDao {
@Insert(onConflict = OnConflictStrategy.REPLACE) //插入,若主key衝突 取代值
public void insert(Expense expense);
@Query("select * from Expense")
public List<Expense> getAll();
}
DataBase
建立資料庫物件,提供一個外界操作DB的instance,宣告用到哪些Entity(Table)。Room.datavaseBuilder(Context, DataBase, DB名稱).build()可以建立一個資料庫。
在此用工廠方法提供唯一一個資料庫操作物件給外部操作。
提供一個abstract方法讓外部取得某個table。
@Database(entities = {Expense.class, Word.class}, version = 1)
public abstract class ExpenseDatabase extends RoomDatabase {
//提供存取Dao的方法
public abstract ExpenseDao expenseDao();
private static ExpenseDatabase instance = null;
public static ExpenseDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, ExpenseDatabase.class, "expense.db").
build();
}
return instance;
}
}
如何操作資料庫
資料庫的輸入輸出都屬於耗時工作,所以要建立一個新的Thread去執行。
以後new Thread不要用了,改用ExecutorService。有執行緒池讓執行緒可以重複利用
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(.........)
new Thread(new Runnable() {
@Override
public void run() {
ExpenseDatabase.getInstance(FinanceActivity.this).expenseDao().insert(new Expense("2020-01-03", "Breakfast", 50));
}
}).start();
//產生執行緒池
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
List<Expense> expenses = ExpenseDatabase.getInstance(FinanceActivity.this).expenseDao().getAll();
for (Expense expense : expenses) {
Log.d(TAG, "onCreate: " + expense.getDate() + " " + expense.getInfo());
}
}
});