A:
好的,請一步一步慢慢分析來實作開始將這些 Entity 和 DAO 組合起來,建立最終的 AppDatabase 類別。另外想請問我在winodws 11上面應該裝什麼軟體來進行後面的測試呢?謝謝
Q:
好的,我們就來完成資料庫建設的最後一步:建立 AppDatabase
類別。這一步就像是把所有建材(Entities)和施工藍圖(DAOs)交給總工程師(Room),讓它幫我們蓋好整座資料庫大樓。
同時,我也會為你解答在 Windows 11 上進行開發與測試需要準備的軟體。
第四步:組合 Entity 與 DAO,建立 AppDatabase
AppDatabase
是一個抽象類別,它繼承自 Room 的 RoomDatabase
。它的作用是:
宣告:告訴 Room 這個資料庫包含哪些資料表 (Entities)。
提供:告訴 Room 這個資料庫有哪些操作方法 (DAOs)。
配置:設定資料庫的版本號和一些遷移策略。
1. 建立 AppDatabase.kt
檔案
首先,在你的專案中建立一個名為 AppDatabase.kt
的新檔案。
2. 編寫 AppDatabase
類別的程式碼
我會將完整的程式碼展示出來,並在下方逐行解釋它的作用。
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
// @Database 註解是關鍵,用來告訴 Room 這是資料庫的主體
@Database(
// entities 陣列中列出所有我們定義過的資料表 (Entity)
entities = [
MainCategory::class,
SubCategory::class,
Transaction::class,
RecurringTransaction::class,
Account::class // 別忘了我們在第一階段就定義好的 Account Entity
],
version = 1, // 資料庫版本號,每次你修改資料表結構時,都需要增加這個版本號
exportSchema = false // 建議設為 false,除非你想把資料庫結構匯出成 JSON 檔案
)
// @TypeConverters 註解用來註冊我們等一下會建立的轉換器
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
// 在這裡,為每一個 DAO 建立一個抽象函式
// Room 會在背後自動幫我們實現這些函式,並回傳可用的 DAO 實例
abstract fun categoryDao(): CategoryDao
abstract fun transactionDao(): TransactionDao
abstract fun recurringTransactionDao(): RecurringTransactionDao
// 也別忘了 AccountDao (假設你也為 Account Entity 建立了 DAO)
abstract fun accountDao(): AccountDao
// companion object 通常用來實作 Singleton 模式,確保 App 中只有一個資料庫實例
// 但因為我們之後會使用 Hilt 來做依賴注入,Hilt 會幫我們管理實例的生命週期,
// 所以這裡可以先不寫 Singleton 的程式碼,讓 Hilt 來處理會更簡單、更標準化。
}
3. 處理特殊資料類型:建立 TypeConverters
你可能已經注意到,在我們的 Entity 中,有些欄位的類型是 Room 無法直接儲存的,例如 TransactionType
和 FrequencyType
這兩個 enum
(列舉)。
Room 預設只知道如何儲存基本類型(如 String
, Int
, Long
, Double
等)。當遇到不認識的類型時,我們需要提供一個「轉換器」(TypeConverter),告訴 Room 如何將這個特殊類型轉換成它認識的樣子。
最常見的做法是將 enum
轉換成 String
來儲存。
建立 Converters.kt
檔案
import androidx.room.TypeConverter
class Converters {
// --- 給 TransactionType 使用的轉換器 ---
@TypeConverter
fun fromTransactionType(value: TransactionType): String {
return value.name // 將 TransactionType.INCOME 轉成 "INCOME" 字串
}
@TypeConverter
fun toTransactionType(value: String): TransactionType {
return TransactionType.valueOf(value) // 將 "INCOME" 字串轉回 TransactionType.INCOME
}
// --- 給 FrequencyType 使用的轉換器 ---
@TypeConverter
fun fromFrequencyType(value: FrequencyType): String {
return value.name
}
@TypeConverter
fun toFrequencyType(value: String): FrequencyType {
return FrequencyType.valueOf(value)
}
}
建立好這個 Converters.kt
檔案後,AppDatabase.kt
裡的 @TypeConverters(Converters::class)
這行程式碼就會生效,Room 在存取資料時就會自動使用我們定義的轉換方法了。
至此,我們的資料庫層就完全建構完畢了! 我們有了資料表結構 (Entities)、操作方法 (DAOs) 以及將它們組合起來的總體資料庫類別 (AppDatabase
)。
在 Windows 11 上需要安裝的軟體
你的第二個問題非常好,工欲善其事,必先利其器。好消息是,你需要的軟體並不多,而且都是免費的。
1. 主要開發軟體:Android Studio
這是 Google 官方提供、唯一推薦的 Android App 開發工具,是一個整合開發環境 (IDE)。它已經包含了你開發、除錯、測試所需的一切。
下載與安裝:
前往 Android 開發者官方網站。
網站會自動偵測你的作業系統是 Windows,點擊下載按鈕下載安裝程式。
執行安裝程式,基本上按照預設選項一直按「下一步」即可。安裝過程中,它會自動下載並設定好 Android SDK (開發工具包) 和其他必要的元件。
2. 資料庫測試工具:App Inspection (內建於 Android Studio)
你不需要安裝任何「額外」的軟體來查看或測試你的 Room 資料庫。 Android Studio 已經內建了一個極其強大的工具叫做 App Inspection (應用程式檢查)。
如何使用它:
在 Android Studio 中,將你的 App 執行在 模擬器 (Emulator) 或用 USB 線連接的 實體 Android 手機 上 (手機需開啟開發者模式與 USB 偵錯)。
當 App 執行後,點擊 Android Studio 底部的 "App Inspection" 視窗分頁。
在 App Inspection 視窗中,你會看到多個選項,點擊 "Database Inspector" (資料庫檢查器)。
Database Inspector 會自動偵測到你 App 中的 Room 資料庫。
你可以做什麼:
即時查看資料表:左側會列出你所有的資料表 (
main_categories
,transactions
等),點擊後右側會顯示表中的所有資料,就像在看 Excel 一樣。執行 SQL 查詢:它提供一個「Run new query」的按鈕,讓你可以直接對資料庫下 SQL 指令來查詢或修改資料,這對於除錯非常方便。
Live Updates (即時更新):你可以勾選 "Live updates" 選項。這樣當你在 App 中執行操作(例如新增一筆交易)時,Database Inspector 裡的資料表會即時刷新,讓你立刻看到資料寫入的結果。
總結一下:
你只需要在 Windows 11 上安裝好 Android Studio。資料庫的測試與查看,直接使用它內建的 Database Inspector 就完全足夠了,功能強大且方便。
我們已經完成了最底層的資料庫建設,下一步就是建立一個 Repository
(資料倉庫層),作為 ViewModel 和資料庫之間的橋樑。準備好的話,我們就可以繼續前進!