プログラム

KotlinでAndroidのSQLite用のライブラリを開発中!

Androidで使用できるSQLite用のライブラリをKotlinで開発しています。
アノテーションをクラスやプロパティに付与することで、SQLiteとの連携をより簡単にするためのライブラリになる予定です。

ライブラリの名前はSQLiteDatabaseOperatorです。
ちなみにこのライブラリは、Google公式のRoom Persistence Libraryの影響を受けています。

GitHubに公開していますので、アノテーションの使い方などの参考にしていただければ幸いです。
SQLiteDatabaseOperator

Version 1.0.0が完成したらGradleで使用できる形にしてライブラリを公開しようと思っています。
よければ使ってみてください!

現段階でのSQLiteDatabaseOperatorの使い方

SQLiteDatabaseOperatorは、アノテーションをクラスとプロパティに付与することで、AndroidのSQLiteのAPIと簡単にかつ安全にやり取りできるようにすることを目標にしているライブラリです。

SQLiteDatabaseOperator内に用意したTableアノテーション、Columnアノテーションなどを付与することで、SQLiteのテーブルのマッピングクラスになります。
マッピングしたクラスを使用して、テーブルのCREATE文の作成や、データベースとのやり取りを行います。

現在は、テーブルのCREATE文の作成までできるようになっています。

以下はアノテーションをクラスとプロパティに付与し、SQLiteのテーブルとやり取りできるマッピングクラスを作成している例です。

// SampleTable.kt

/**
 * SQLiteDatabaseOperatorのサンプルテーブル。
 *
 * @param id プライマリキーになるカラム。
 * @param nullableInt Nullが可能なINTEGER型のカラム。
 * @param limitedLengthString 文字数制限されたカラム。
 * @param intWithDefault デフォルト値が設定されたINTEGER型のカラム。
 * @param stringWithDefault デフォルト値が設定されたTEXT型のカラム。
 */
@Table("sample_table")
@PrimaryKey("_id")
@Unique("limited_length_string")
data class SampleTable(
    @Column(name = "_id")
    val id: Long = 0,
    @Column(name = "nullable_int")
    val nullableInt: Int?,
    @Column(name = "limited_length_string", length = 256)
    val limitedLengthString: String,
    @Column(name = "int_with_default", defaultValue = "12345")
    val intWithDefault: Int,
    @Column(name = "string_with_default", defaultValue = "Default Value")
    val stringWithDefault: String
) : SQLiteTableBase()

上記のマッピングクラスを定義することで、以下の処理でテーブルのCREATE文を作成することができます。

// CreateTable.kt

Log.println(Log.INFO, "TableInfo", SQLiteTableOperator.makeCreateTableQuery<SampleTable>())

SQLiteTableOperator.makeCreateTableQueryにテーブルクラスを渡すことでテーブルのCREATE文を作成します。

現在はここまでしか開発していないですが、このテーブルクラスを使ってSQLiteとデータのやり取りをできるようにしたいと考えています。

SQLiteDatabaseOperatorを開発することになった経緯

現在、Androidのアプリを個人開発していて、そのアプリの中でデータベースを使用しています。

Android標準のAPIって、CREATE文などのクエリを書く手間があったり、insertメソッドやデータ取得する際に色々と手続きが必要だったりするじゃないですか。
後、他のアプリでデータベースを使用する時にも、以前開発したアプリでやってたこととほぼ同じようなことを書くことがあったりと、面倒だなっと思ったのがこのライブラリを開発するに至った理由です。

また、開発しようと思い至った時、Room Persistence Libraryの存在を知らなかったのも大きな理由です。

後にこのRoom Persistence Libraryの存在を知った時は、もっと早く知っていればこのライブラリなんて作ってなかったのにな、と思い落胆したりもしました笑

ですが、せっかくライブラリを作り始めたわけですし、どうせならRoom Persistence Libraryを参考に自分が欲しい機能を盛り込んだライブラリを作ってみようかなと思い、開発を続行することに決めました。

このライブラリはGitHubで公開しているのですが、オープンソースで公開すれば運がよければフィードバックがもらえるかもしれませんし、自分の活動の履歴が世に残るしいい経験になるかなと思いオープンソースで公開しています。

完成するまでにはしばらく時間がかかるとは思いますが、ゆっくりと自分が作りたいものを作っていこうと考えています。

SQLiteDatabaseOperatorに実装する機能

SQLiteDatabaseOperatorで実装する予定の機能を紹介します。
以下にあげる機能は既にライブラリ内に組み込まれているものもあります。

Version 1.0.0に実装する機能は以下になります。

  • アノテーションをクラスとプロパティに使用することで、SQLiteのテーブルのマッピングクラスにする機能
  • クラス、プロパティに付与されたアノテーションを解析し、テーブルのCREATE文を作成する機能
  • アノテーションが付与されたプロパティが非Null型ならカラムをNOT NULLで定義し、プロパティがNull可能型ならNOT NULLで定義しない機能
  • プライマリキー、ユニーク、インデックス、外部キー制約をテーブルに設定する機能
  • 外部キー制約のアクション(ON DELETE CASCADEなど)をテーブルに設定する機能
  • アノテーションが付与されたマッピングクラスを使用して、INSERT、UPDATE、DELETE、SELECTを標準のAPIより簡単に行う機能
  • JOINを使用して複数のテーブルのデータをSELECTする機能

Version 1.0.0以降に実装したい機能

  • データベースのバージョン対応(SQLiteOpenHelper.onUpgradeへの対応)
  • アノテーションに指定された情報を元に、SQLiteOpenHelperの継承クラスの自動生成
  • 自動生成したSQLiteOpenHelperの継承クラスを使用して、INSERT、UPDATE、DELETE、SELECTをするクラスの自動生成
  • SQLiteOpenHelperの継承クラスを自動生成する際に、アノテーションを解析し、onUpgradeを自動で実装する機能

まとめ

Kotlinでライブラリを作り始めて色々と気づくことがあります。
モダンなプログラムの書き方やKotlin特有の書き方などを知ることができ、勉強にもなっています。

まだ完成していませんが、このライブラリをGitHubに公開することで自分の身に何らかの変化があればいいなと思っています。