SQLDelight 1.0 使い方 #1

バージョン1.0アナウンスされています。

Announcing SQLDelight 1.0 – Alec Strong – Medium

神も。


データベース周りにRoom他のライブラリをご利用の方も試してみてはどうでしょうか。

square/sqldelight: Generates typesafe Kotlin APIs from SQL

SQLDelight は、以下のようなSQLステートメントからデータベース、テーブル、タイプセーフなAPIを作成できます。

HockeyPlayer.sq


CREATE TABLE hockeyPlayer (
  player_number INTEGER NOT NULL,
  full_name TEXT NOT NULL
);

CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);

INSERT INTO hockeyPlayer (player_number, full_name)
VALUES (15, 'Ryan Getzlaf');

selectAll:
SELECT *
FROM hockeyPlayer;

insert:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES (?, ?);

定義したAPIは以下のように利用できます。



val driver = AndroidSqliteDriver(Database.Schema, this, "test.db")
val database = Database(driver)
val playerQueries = database.hockeyPlayerQueries

// selectAll
println(playerQueries.selectAll().executeAsList())
// Prints [HockeyPlayer.Impl(15, "Ryan Getzlaf")]

// insert
playerQueries.insert(player_number = 10, full_name = "Corey Perry")
playerQueries.insert(player_number = 999, full_name = "フグ田 サザエ")

// selectAll
println(playerQueries.selectAll().executeAsList())
// Prints [HockeyPlayer.Impl(15, "Ryan Getzlaf"), HockeyPlayer.Impl(10, "Corey Perry")]

利用前の build で build/generated/ 以下に書き出されますが、gradle のバージョンが限定されるように見えました。何か設定が足りないのかもしれません。

gradle-wrapper.properties


distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip

実際サンプルを動かす風景。



利用方法など今回バージョン1.0 で変わっているようなので、

数回に渡って実装に利用できるとこまでやってみたいと思います。

(つづく...)

SQDelight の データベースバージョン
Reddit: Announcing SQLDelight 1.0 – Alec Strong – Medium
SQLDelight 1.0 使い方 #2


NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion とかでた。

[Developer Preview Android P] NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion; inside of com.google.android.gms [79478779] - Visible to Public - Issue Tracker

If your app is targeting API level 28 (Android 9.0) or above, you must include the following declaration within the element of AndroidManifest.xml.

対策は以下。AndroidManifest.xml。


<application ...
  ....
  <uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />

Project Configuration  |  Maps SDK for Android  |  Google Developers

今回は、GoogleMap SDK vs API-28(9.0/Pie) だったけど、他でも出そうで、使えそう。


java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android'

なんなんすかね。

どっちかといえば、環境依存のバグではまる時間が増えてますよね。


-keepnames class kotlinx.** { *; }

IllegalStateException: Module with the Main dispatcher is missing · Issue #799 · Kotlin/kotlinx.coroutines


# ServiceLoader support
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}

# Most of volatile fields are updated with AFU and should not be mangled
-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}

Android app with coroutines 0.30.1-eap13 crashes in runtime · Issue #657 · Kotlin/kotlinx.coroutines

あちこち依存周りで統率取れてない感ありません?

Jetifier forces Dagger 2.16 even when 2.17 is declared as a dependency [115738511] - Visible to Public - Issue Tracker