iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

因為之前已經講的很詳細,所以叫 Gemini CLI 開始寫扣後,很簡單就做出想要的功能

AI 寫扣經過

  1. 現在,我將建立 NoteEntity.kt 檔案。根據我們的設計,一篇筆記需要包含 ID、標題、內容、分類 ID (外鍵)、標籤列表 (需要 TypeConverter)、以及時間戳。
  2. 接下來,我將建立 CategoryEntity.kt。它需要包含 ID、分類名稱,以及我們討論過的、用於自訂排序的 sortOrder 欄位。
    @Entity(
        tableName = "notes",
        foreignKeys = [
            ForeignKey(
                entity = CategoryEntity::class,
                parentColumns = ["id"],
                childColumns = ["categoryId"],
                onDelete = ForeignKey.CASCADE
            )
        ]
    )
    data class NoteEntity(
        @PrimaryKey(autoGenerate = true)
        val id: Long = 0,
        val title: String,
        val content: String,
        val categoryId: Long,
        val tags: List<String>,
        val createdAt: Long,
        val updatedAt: Long
    )
    
  3. 接下來,我將建立 CategoryEntity.kt。它需要包含 ID、分類名稱,以及我們討論過的、用於自訂排序的 sortOrder 欄位。
    @Entity(tableName = "categories")
    data class CategoryEntity(
        @PrimaryKey(autoGenerate = true)
        val id: Long = 0,
        val name: String,
        val sortOrder: Int
    )
    
  4. 首先是 NoteDao.kt。我會加入基本的增、刪、改、查方法。特別是查詢所有筆記的方法,我會讓它返回一個 Flow<List>,這樣 UI 層就可以響應式地接收資料庫的更新。
    @Dao
    interface NoteDao {
    
        @Query("SELECT * FROM notes ORDER BY updatedAt DESC")
        fun getAllNotes(): Flow<List<NoteEntity>>
    
        @Query("SELECT * FROM notes WHERE id = :id")
        suspend fun getNoteById(id: Long): NoteEntity?
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertNote(note: NoteEntity): Long
    
        @Update
        suspend fun updateNote(note: NoteEntity)
    
        @Delete
        suspend fun deleteNote(note: NoteEntity)
    }
    
  5. 接下來是 CategoryDao.kt。它將包含查詢所有分類(按 sortOrder 排序)、插入、更新和刪除分類的方法。
    @Dao
    interface CategoryDao {
    
        @Query("SELECT * FROM categories ORDER BY sortOrder ASC")
        fun getAllCategories(): Flow<List<CategoryEntity>>
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertCategory(category: CategoryEntity): Long
    
        @Update
        suspend fun updateCategory(category: CategoryEntity)
    
        @Delete
        suspend fun deleteCategory(category: CategoryEntity)
    }    
    
  6. 我將在 data/database 包下建立 AppDatabase.kt 檔案。這個類別會是一個繼承自 RoomDatabase 的抽象類別,並使用 @Database 註解來聲明它包含了哪些 Entities,以及它的版本號。
    @Database(
        entities = [
            SampleEntity::class  // 範例 Entity,實際專案中可替換為真實 Entity
            // TODO: 在此新增其他 Entity 類別,例如: UserEntity::class, PostEntity::class
        ],
        version = 1,
        exportSchema = false  // 設為 true 並配置 room.schemaLocation 以匯出資料庫架構
    )
    @TypeConverters(Converters::class)
    abstract class AppDatabase : RoomDatabase() {
    
        // TODO: 在此新增 DAO
        // 範例:
        // abstract fun userDao(): UserDao
        // abstract fun postDao(): PostDao
    
        companion object {
            const val DATABASE_NAME = "app_database"
        }
    }    
    
  7. 使用 Hilt 來提供 (Provide) 這個 AppDatabase 的單例 (Singleton) 給整個 App 使用。我們不希望每次使用資料庫時都去建立一個新的實例。
  8. 我將在 core 包下建立一個 di (Dependency Injection) 的子包,並在其中建立一個 DatabaseModule.kt 檔案。這個 Hilt Module 會告訴 Hilt 如何建立 AppDatabase 的實例,以及如何從 AppDatabase 實例中獲取 DAO。
    @Module
    @InstallIn(SingletonComponent::class)
    object DatabaseModule {
    
        @Provides
        @Singleton
        fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
            return Room.databaseBuilder(
                context,
                AppDatabase::class.java,
                "note_app.db"
            ).build()
        }
    
        @Provides
        fun provideNoteDao(appDatabase: AppDatabase): NoteDao {
            return appDatabase.noteDao()
        }
    
        @Provides
        fun provideCategoryDao(appDatabase: AppDatabase): CategoryDao {
            return appDatabase.categoryDao()
        }
    }    
    

上一篇
114/19 - Vibe Coding 程式架構提示設計(下)
下一篇
114/21 - Vibe Coding 建立領域層
系列文
看見筆記捲土重來,試著用 Vibe Coding 完成一款 App 吧!25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chiaominchang222
iT邦新手 5 級 ‧ 2025-10-04 12:57:22

能感受到有專業知識之後操控的gpt高效很多

我要留言

立即登入留言