👉 Getting Started - Multiplatform - SQLDelight 
👉 SQLDelight 1.x Quick Start Guide for Android – Handstand Sam 
マルチプラットフォームに対応していますが、
まずは、Android のみで使ってみると良いです。
👉 Getting Started - Android - SQLDelight 
Todo アプリ向けの Repository を作ります。

Hilt と Flow を使っています。
■ インストール
Gradleまわりは書き方いろいろですけども適宜書き換えてください。
buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath 'com.squareup.sqldelight:gradle-plugin:1.5.3'
  }
}
apply plugin: 'com.squareup.sqldelight'
// android driver
implementation "com.squareup.sqldelight:android-driver:1.5.3"
// flow-coroutine extension 
implementation "com.squareup.sqldelight:coroutines-extensions:1.5.3"
■ スキーマ / クエリー
パッケージ名を、com.your.package としています。
-- app/src/main/sqldelight/com/your/package/data/Todo.sq
CREATE TABLE todo (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  text TEXT NOT NULL,
  updated INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
INSERT INTO todo(text) VALUES ('宿題をする');
INSERT INTO todo(text) VALUES ('マンガを読む');
INSERT INTO todo(text) VALUES ('プールに行く');
selectAll:
SELECT * FROM todo ORDER BY updated DESC;
deleteAll:
DELETE FROM todo;
insert:
INSERT INTO todo (text) VALUES (:text);
update:
UPDATE todo SET text = :text, updated = (strftime('%s', 'now')) WHERE id = :entryId;
delete:
DELETE FROM todo
WHERE id = :entryId;
count:
SELECT COUNT(id) FROM todo;
Todo.sq ファイルをテキストで作成して、テーブル定義、実行クエリーとメソッド名を箇条書きします。
配置位置は、上記コメントの位置が自然で分かりやすいと思います。
この場合、SQLDelight によって以下に実装に利用するクラス群が生成されます。
app/build/generated/sqldelight/code/Database/debug/com/your/package/
■ Database Module
SQLDelightによって生成された Database クラスを利用して書きます。
今回は Android向けなので、AndroidSqliteDriver を使っています。
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
  @Provides
  @Singleton
  fun provideDatabase(@ApplicationContext context: Context): Database {
    val driver = AndroidSqliteDriver(Database.Schema, context, DB_NAME)
    return Database(driver)
  }
  private const val DB_NAME = "database.db"
}
JetpackCompose の UI である Screen-level の Composable はマルチに稼働しているので、 @Singleton としておくことを忘れてはなりません。
■ Repository
時間のかかる処理は Flow を使っておきます。
class TodoRepository @Inject constructor(
  private val database: Database
) {
  fun load(): Flow<List<Todo>> {
    return database.todoQueries.selectAll().asFlow().mapToList(Dispatchers.IO)
  }
  fun count(): Flow<Long> {
    return database.todoQueries.count().asFlow().mapToOne(Dispatchers.IO)
  }
  fun insert(text: String) {
    database.todoQueries.insert(text)
  }
  fun update(id: Long, text: String) {
    database.todoQueries.update(text, id)
  }
  fun delete(id: Long) {
    database.todoQueries.delete(id)
  }
}
Flow - Couroutine Extension は非常に便利です。
fun load(): Flow<List<Todo>> {
  return database.todoQueries.selectAll().asFlow().mapToList(Dispatchers.IO)
}
Cold な Flow で単発の List<Todo> の emit ではなく、データベースが変更されるたびに、新しい List<Todo> を emit してくれます。
@JvmName("toFlow")
fun <T : Any> Query<T>.asFlow(): Flow<Query<T>> = flow {
  val channel = Channel<Unit>(CONFLATED)
  channel.trySend(Unit)
  val listener = object : Query.Listener {
    override fun queryResultsChanged() {
      channel.trySend(Unit)
    }
  }
  addListener(listener)
  try {
    for (item in channel) {
      emit(this@asFlow)
    }
  } finally {
    removeListener(listener)
  }
}
👉 sqldelight/FlowExtensions.kt at master · cashapp/sqldelight 
(更新中...)
 
		 
           
          






