Vibe coding全紀錄-4

 A:

 好的,請一步一步慢慢分析來實作開始將這些 Entity 和 DAO 組合起來,建立最終的 AppDatabase 類別。另外想請問我在winodws 11上面應該裝什麼軟體來進行後面的測試呢?謝謝 

Q:

好的,我們就來完成資料庫建設的最後一步:建立 AppDatabase 類別。這一步就像是把所有建材(Entities)和施工藍圖(DAOs)交給總工程師(Room),讓它幫我們蓋好整座資料庫大樓。

同時,我也會為你解答在 Windows 11 上進行開發與測試需要準備的軟體。


第四步:組合 Entity 與 DAO,建立 AppDatabase

AppDatabase 是一個抽象類別,它繼承自 Room 的 RoomDatabase。它的作用是:

  1. 宣告:告訴 Room 這個資料庫包含哪些資料表 (Entities)。

  2. 提供:告訴 Room 這個資料庫有哪些操作方法 (DAOs)。

  3. 配置:設定資料庫的版本號和一些遷移策略。

1. 建立 AppDatabase.kt 檔案

首先,在你的專案中建立一個名為 AppDatabase.kt 的新檔案。

2. 編寫 AppDatabase 類別的程式碼

我會將完整的程式碼展示出來,並在下方逐行解釋它的作用。

Kotlin
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 無法直接儲存的,例如 TransactionTypeFrequencyType 這兩個 enum (列舉)。

Room 預設只知道如何儲存基本類型(如 String, Int, Long, Double 等)。當遇到不認識的類型時,我們需要提供一個「轉換器」(TypeConverter),告訴 Room 如何將這個特殊類型轉換成它認識的樣子。

最常見的做法是將 enum 轉換成 String 來儲存。

建立 Converters.kt 檔案

Kotlin
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)。它已經包含了你開發、除錯、測試所需的一切。

  • 下載與安裝:

    1. 前往 Android 開發者官方網站

    2. 網站會自動偵測你的作業系統是 Windows,點擊下載按鈕下載安裝程式。

    3. 執行安裝程式,基本上按照預設選項一直按「下一步」即可。安裝過程中,它會自動下載並設定好 Android SDK (開發工具包) 和其他必要的元件。

2. 資料庫測試工具:App Inspection (內建於 Android Studio)

你不需要安裝任何「額外」的軟體來查看或測試你的 Room 資料庫。 Android Studio 已經內建了一個極其強大的工具叫做 App Inspection (應用程式檢查)。

  • 如何使用它:

    1. 在 Android Studio 中,將你的 App 執行在 模擬器 (Emulator) 或用 USB 線連接的 實體 Android 手機 上 (手機需開啟開發者模式與 USB 偵錯)。

    2. 當 App 執行後,點擊 Android Studio 底部的 "App Inspection" 視窗分頁。

    3. 在 App Inspection 視窗中,你會看到多個選項,點擊 "Database Inspector" (資料庫檢查器)。

    4. 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 和資料庫之間的橋樑。準備好的話,我們就可以繼續前進!