Room Database:識別子(RoomDatabase)の共有

投稿日:  更新日:

Room(Android Jetpack)でデータベースを構築した場合、アプリのパフォーマンスを考えると、識別子の共有が必要になってきます。

この点について、まとめました。

※環境:Android Studio Ladybug | 2024.2.1 Patch 3
    Kotlin 2.0.0
    androidx.sqlite:sqlite:2.4.0
    androidx.room:room-*:2.6.1

※サンプルの全体像は「Roomでデータベースを構築」を参照

スポンサーリンク

識別子の共有

データベースのアクセスを開始する前に、データベースと接続の確立(Open)を行います。

データベース識別子は、その結果として得られるものです。

この接続の確立ですが、非常にコスト(処理時間、CPUの能力消費、メモリー消費)の大きい処理です。ドキュメントにそのような説明があります。

ですので、アプリケーション全体のパフォーマンスを考えると、極力、回数を減らす実装が必要となります。

その方法は2つです。

  • ・識別子のシングルトン化
  • ・識別子をコンポーネント間で共有
スポンサーリンク

シングルトン化

RoomDatabaseクラスを継承した子クラス(GameDb)に実装した#getDatabase()はファクトリーメソッドです。

初回の#getDatabase()でビルドした自身のインスタンスを、結果として返すと共に、静的な変数instanceへ自己保持します。

2回目以降の#getDatabase()は、変数instanceからインスタンスを返し、ビルドは行われません。

ですので、#getDatabase()で返されるインスタンスはシングルトンになります。

@Database(entities = arrayOf(Player::class), version = 1)
abstract class GameDb : RoomDatabase() {

    abstract fun playerDao(): PlayerDao

    companion object {
        @Volatile
        private var instance: GameDb? = null
        fun getDatabase(context: Context): GameDb {
            return instance ?: synchronized(this) {
                val _instans = Room.databaseBuilder(
                    context,
                    GameDb::class.java,
                    "Game.db"
                )
                    .build()
                instance = _instans     // 自己保持
                _instans                // 結果として返す
            }
        }
    }
}
スポンサーリンク

コンポーネント間で共有

Applicationクラスを使って、RoomDatabase(GameDb)インスタンスの共有を行います。
※Applicatinについては「アプリ全体から参照可能なインスタンス(Application)」を参照

class MyApplication : Application() {
    val gameDb: GameDb by lazy { GameDb.getDatabase(this) }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:name=".MyApplication"
        ...>
        <activity
            android:name=".MainActivity"
            ...>
            ...
        </activity>
    </application>

</manifest>
class MainActivity : ComponentActivity() {

    private lateinit var gameDb: GameDb
    private lateinit var playerFlow: MutableStateFlow<List<Player>>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            ...
        }

        gameDb = (application as MyApplication).gameDb
        playerFlow = MutableStateFlow<List<Player>>(listOf<Player>())
        lifecycleScope.launch(Dispatchers.Default) {
            val _list = gameDb.playerDao().fetchTopX(10)
            playerFlow.value = _list
        }
    }
	...
}

Applicationを介して参照するRoomDatabase(GameDb)インスタンスは、どのコンポーネント(Activity)からも共有さます。

スポンサーリンク

関連記事:

Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。 有効そうだけど、実態がよくわからないので、いろいろ調べて理解した内容をまとめました。 ...
Androidは標準でSQLiteというRDBMS(Relational Database Management System)を扱います。 SQLiteは少し個性的なデータベースです。 データベース全般の説明を通して、SQLiteと他の違いをまとめます。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 2     Kotlin 2.0.0 ...
データベースを扱うアプリケーションの開発で、動作を確認するためにデータベースの閲覧が出来ると便利です。 データベースは、マネージメントシステムを介してアクセスされるため、プログラムからブラックボックスに見えます。 ですので、データベース内部の問題は見つけ難いです。 デバックおいてデータベースの閲覧が出来れば、内部の問題を用意に確認できます。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 2     DB Browser for SQLite バージョン 3.13.1 ...
Androidが標準で扱うデータベースはSQLiteです。 ※詳細は「Androidで扱うデータベース」を参照 データベースを構築する方法は「SQLite API(Android SDK)」と「Room(Android Jetpack)」の2通りがあります。 今回は「Room」でデータベースを構築する方法を紹介します。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 2     Kotlin 2.0.0     androidx.sqlite:sqlite:2.4.0     androidx.room:room-*:2.6.1 ...
アプリケーションが始めて起動した直後に、データの事前取り込み(初期状態の設定)を必要とする場合があります。 事前取り込みの方法ついて、まとめました。 Room(Android Jetpack)でデータベースを構築した場合です。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 3     Kotlin 2.0.0     androidx.sqlite:sqlite:2.4.0     androidx.room:room-*:2.6.1     DB Browser for SQLite バージョン 3.13.1 ※サンプルの全体像は「Roomでデータベースを構築」を参照 ...
Roomは処理の開始時にコールバックを受け取ることができます。 このコールバックついて、まとめました。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 3     Kotlin 2.0.0     androidx.sqlite:sqlite:2.4.0     androidx.room:room-*:2.6.1     DB Browser for SQLite バージョン 3.13.1 ※サンプルの全体像は「Roomでデータベースを構築」を参照 ...
Room(Android Jetpack)でデータベースを構築した場合、データベースへアクセスする際に、データベースのOpenとCloseという処理を伴います。 この点について、まとめました。 ※環境:Android Studio Ladybug | 2024.2.1 Patch 3     Kotlin 2.0.0     androidx.sqlite:sqlite:2.4.0     androidx.room:room-*:2.6.1 ※サンプルの全体像は「Roomでデータベースを構築」を参照 ...
スポンサーリンク