【Gemini/Claude活用】プロンプト付き!生成AIと作るAndroidアプリ開発入門:第3回「DB開発」

概要

生成AIと対話しながらAndroidアプリを開発していこうとして今回で第3回となりました。

前回の記事ではAndroid Studioのエミュレータを使用して簡単なアプリを動かすところまで進めることができました。前回の記事→こちら

今回からはとうとう自分が作りたかったアプリを実際に作っていこうと思います。

おさらいにはなりますが、作りたいアプリは「カラオケの歌いたい曲や練習曲をメモしておけるアプリ」でした。忘れてないですよ(;'∀')

使用環境

  • Windows 11
  • Google Gemini (無料枠)
  • Claude (無料プラン)

ここも変わらないですね。有料枠が使える方はそちらで作ったら一瞬で終わるんじゃないかなと思います...( ´∀` )

UI開発

早速、UI開発に移りたいと思います!ここまで使用していたのはGemini君でしたが、ここからはコードを書いていくのでClaude君に任せてみようと思います。ちなみに、Claude君は何も触らずデフォルト設定のままです。

入れたい機能

第1回のときに明言していた入れる機能は以下でした。第1回の記事→こちら

  • 持ち歌、練習曲、歌いたい曲をメモしておける
  • 追加のとき、曲名と歌手名をフリーで入力できる
  • メモした内容を検索する機能も入れておきたい

こちらをClaude君に伝えつつ、どういう配置にしたいかをプロンプトに投げてみたいと思います。

一旦やりたいことを投げてみる

以下の内容を伝えてみました。

かなりざっくり伝えてみましたが、Claude君は汲み取ってくれるのでしょうか。

回答は以下です!概要から固めていくタイプで安心です。提示されたステップは4つでした。ちょっとすべて載せるのは冗長かなと思いますので、提示されたファイル構成と進め方を載せます。

今回の記事では、2までを作成します!

1. まず build.gradle に依存関係を追加してビルドが通るか確認

提案された内容はこちらなので、該当のファイルにコピペをします。

コピペ用はこちらから
// build.gradle.kts(app) dependencies内に追加
// Room Database
implementation("androidx.room:room-runtime:2.6.1")
implementation("androidx.room:room-ktx:2.6.1")
kapt("androidx.room:room-compiler:2.6.1")

// ViewModel & LiveData
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")

// Compose (すでに入っているはずですが念のため)
implementation("androidx.compose.material3:material3:1.2.0")
implementation("androidx.navigation:navigation-compose:2.7.6")
// build.gradle.kts(app) plugins内に追加
id("kotlin-kapt")

ここで、build.gradle.kts (app)とappの指定があるので間違わなかったですが、よく見るとProjectというものもありますね。これの違いについてはこちらの記事が参考になりました→「なぜ build.gradle.kts が2つあるの?

よく見ると、kaptから始まる行が赤くエラー表示になりました。解決方法を聞いてみましょう。

エラーの解消

一旦直接聞いてみます。プロンプトは以下です。

KSPが推奨なのかい笑 最初から提示してほしいですが、修正方法に則って変更を加えてみます。

コピペ用 はこちらから
// build.gradle.kts(app) plugins内の修正
// ❌ 削除
id("kotlin-kapt")

// ✅ 追加
id("com.google.devtools.ksp")
// build.gradle.kts(app) dependencies内の修正
// ❌ 削除
kapt("androidx.room:room-compiler:2.6.1")

// ✅ 追加
ksp("androidx.room:room-compiler:2.6.1")
// build.gradle.kts(Project) plugin内に追記
id("com.google.devtools.ksp") version "2.0.21-1.0.28" apply false

結果はこちらです。

あれ、変わっていないですね。。下にあるエラー内容を伝えてみましょうか。

伝えてはみたのですが、押し問答になってます。聞き方が悪かったのか、ここの辺りでClaude君の回答が怪しい感じに。何回かラリーをしたのですが、意固地になりエラーが増える一方なので、一旦ここでコード自体の修正は止めます。kspに変えたところでストップ!

私にAndroid Studioの知識がないので、インプットしましょう。自分はいろいろとGoogle先生に訊いてみました。

参考記事→ Android ビルドシステムを設定する

参考記事ですが、途中からレイアウトが崩れてますね。「同期する」と見えるところからが参考になります。

ここに何かありますね!「Sync Now」ボタンを押してみましょう。

エラーが解消されました!よかったです。

2. data/ 配下のDBファイルを作成

プロンプトではStep2を促しました。

回答はこちらでしたので、ひたすらコピペしてファイルの作成をしていきます。

追加方法ですが、以下の方法で行ってください。

  1. まず「MainActivity.kt」のファイルをクリックします(その階層に移動する)
  2. 上部にある「+」ボタンを押し、「Package」を選択。名前を「data」にします。
  3. 「data」パッケージをクリックし、この中にファイルを作成していきます。
  1. 「Song.kt」を作成します。
    • 「+」ボタンを押下し、「Kotlin Class/File」を選択します
    • 名前を「Song」にし、「Data class」を選択します
    • ファイルの中身をClaude君が提示した内容に変更します
  2. 「SongDao.kt」を作成します
    • 「+」ボタンを押下し、「Kotlin Class/File」を選択します
    • 名前を「SongDao」にし、「Interface」を選択します
    • ファイルの中身をClaude君が提示した内容に変更します
  3. 「SongDatabase.kt」を作成します
    • 「+」ボタンを押下し、「Kotlin Class/File」を選択します
    • 名前を「SongDatabase」にし、「Class」を選択します
    • ファイルの中身をClaude君が提示した内容に変更します

コピペ用はこちらから
//// 1. Song.kt
package com.example.yourapp.data

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "songs")
data class Song(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val title: String,
    val artist: String,
    val category: String
)
//// 2. SongDao.kt
package com.example.yourapp.data

import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface SongDao {
    @Query("SELECT * FROM songs WHERE category = :category AND (title LIKE '%' || :query || '%' OR artist LIKE '%' || :query || '%')")
    fun getSongsByCategoryAndQuery(category: String, query: String): Flow<List<Song>>

    @Insert
    suspend fun insert(song: Song)

    @Delete
    suspend fun delete(song: Song)
}
//// 3. SongDatabase.kt
package com.example.yourapp.data

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [Song::class], version = 1)
abstract class SongDatabase : RoomDatabase() {
    abstract fun songDao(): SongDao

    companion object {
        @Volatile
        private var INSTANCE: SongDatabase? = null

        fun getDatabase(context: Context): SongDatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    context.applicationContext,
                    SongDatabase::class.java,
                    "song_database"
                ).build().also { INSTANCE = it }
            }
        }
    }
}

テストをしてみる

Claude君はそのままUI開発までしたかったようですが、折角なので作ったプログラムが動くか確認していきましょう。

コピペ用はこちらから
package com.example.yourapp

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.example.yourapp.data.Song
import com.example.yourapp.data.SongDatabase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val db = SongDatabase.getDatabase(this)
        val dao = db.songDao()

        // テスト用:DB書き込み&読み込み
        CoroutineScope(Dispatchers.IO).launch {
            // 1件追加
            dao.insert(Song(title = "テスト曲", artist = "テスト歌手", category = "my_songs"))

            // 取得して確認
            val songs = dao.getSongsByCategoryAndQuery("my_songs", "").first()
            println("DB取得件数: ${songs.size}")
            songs.forEach { println("曲名: ${it.title}, 歌手: ${it.artist}") }
        }

        setContent {
            MaterialTheme {
                Surface(modifier = Modifier.fillMaxSize()) {
                    Text("DBテスト中…Logcatを確認してください", modifier = Modifier.padding(16.dp))
                }
            }
        }
    }
}

今回は確認方法をClaude君が提示しているので、「MainActivity.kt」を変更して確認していきます。

エミュレータを起動して、アプリを起動してみます。

あれ?と思ったのですが、ソースコードを見返すと、所々「com.example.yourapp」となっていることに気づきました。恥ずかしい。置換します。誤:「com.example.yourapp」→ 正:「com.example.karaokememo」

それを修正して実行してみると...

やっぱり駄目でした。潔くエラー内容を貼って聞いてみます。

バージョンが合わないんじゃないかと提示されました。そのため、もう一度ソースコードを見直します。すると、気づきが。例えばですが、「libs.versions.toml」をよくよく見ると、電球マークが光ってました。

これを直してみます。直したファイルは「libs.versions.toml」「build.gradle.kts(app), (Project)」です。その後、「Sync Now」ボタンを押下します。しばらくすると、Android Studioの画面下部にあったプログレスバーが消えると思います。

違うエラーがでました...。

ここからちょっと泥沼にはまったので、一旦今回の記事はここまでで!

次回にはエラーを解消してきます!

ではではまた次の記事で!

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です