「Android Debug Database」で SQLite の確認・操作する方法

Android内に、

ただ、これだけのテーブルを作って、


CREATE TABLE player (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  number INTEGER NOT NULL,
  name TEXT NOT NULL,
  UNIQUE (number, name)
);

これだけのデータを入れて、


[
  { "number": 1, "name": "柴田勲" },
  { "number": 2, "name": "土井正三" },
  { "number": 3, "name": "張本勲" },
  { "number": 4, "name": "王貞治" },
  { "number": 5, "name": "シピン" },
  { "number": 6, "name": "高田繁" },
  { "number": 7, "name": "河埜和正" },
  { "number": 8, "name": "福嶋智春" },
  { "number": 9, "name": "新浦壽夫" }
]

で、実際にきちんと格納されているかどうか。

みんなはどうやって見てます?

 

コード上でログで吐く

selectAll() など書いてログに出力する。

うん、見づらい。

Flip Tables で List を見やすくログに表示する

 

コマンドラインとかSQLiteBrowser

.dbファイルをPC上にコピーして、それをそれらで開く。


$ sqlite3 test.db 
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> select * from player;
id          number      name
----------  ----------  ----------
1           1           柴田勲
2           2           土井正三
3           3           張本勲
4           4           王貞治
5           5           シピン
6           6           高田繁
7           7           河埜和正
8           8           福嶋智春
9           9           新浦壽夫

はい、いちいちPC上にコピーするのが面倒。

 

IDEのDatabaseビューア

dbファイルパーミッションの厳格化でIDEから直接見ることはできない。

ので、いちいち、PC上にコピー。

毎回、ビューアの設定やパスの指定や同期の確認。

はい、操作多すぎ。

 

Facebook製 Stetho

Stetho - A debug bridge for Android applications

デバッグコードを多少埋め込む。


dependencies {
  compile 'com.facebook.stetho:stetho:1.5.0'
}


public class MyApplication extends Application {
  public void onCreate() {
    super.onCreate();
    Stetho.initializeWithDefaults(this);
  }
}

埋め込んだら、Chromeで開く。

chrome://inspect/#devices

なんで、ID列が2列あるんだよっ!?

リードオンリー。

 

Android Debug Database

amitshekhariitbhu/Android-Debug-Database: A library for debugging android databases and shared preferences - Make Debugging Great Again

一行のみ。


debugImplementation 'com.amitshekhar.android:debug-db:1.0.4'

ログに出力されるURLをクリック。

ブラウザに表示される。

クエリー実行や行ごとの編集もブラウザから可能。

これにしよう。

「Make Debugging Great Again」ですね!

しかし、Room で見れない。
「room」 - Issues · amitshekhariitbhu/Android-Debug-Database

 

まとめ

どうにも、「File Explorer」を使ってのファイルコピー操作がだるい。

確認のたびに、接続や同期、ファイル上書き確認が必要。

しかも、コピーするファイルって、

data/data/your-application-package/databases 以下


your-database-name
your-database-name-shm
your-database-name-wal

の3つが必要なんじゃね?

しらんけど。

SQLiteのジャーナルモード - なべ’s blog


SQLDelight 1.0 使い方 #2

前回でとりあえずREADMEのサンプルで使ってみました。

今回は、それを利用しての、DAO的な LocalRepository を作ります。

とりあえずおおまかな構成重視で細かいことはあとで調整していきます。


class LocalRepository(context: Context) {

  private val driver = AndroidSqliteDriver(Schema, context, "test.db")
  private val queries = Database(driver).playerQueries

  fun insert(player: GiantsPlayer) {
    queries.insert(player.number, player.name)
  }

  fun selectAll(): List<GiantsPlayer> {
    return queries.selectAll()
        .executeAsList().map {
          GiantsPlayer(it.number, it.name)
        }
  }

}


data class GiantsPlayer(
  val number: Long,
  val name: String
)

動画で雰囲気を。



最終的にはテキストでわかりやすくまとめます。

とりあえず、おおまかに。

(つづく...)

SQLDelight 1.0 使い方 #1
SQDelight の データベースバージョン


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