Android向けORMライブラリ GreenDao の導入と実装ガイド

GreenDaoは、Android開発において広く利用されている軽量かつ高速なORM(Object-Relational Mapping)フレームワークです。SQLiteデータベースの操作を抽象化し、オブジェクト指向のプログラミングスタイルで効率的にデータを扱うことができます。本記事では、GreenDaoのセットアップから、エンティティの定義、データベースパスのカスタマイズ方法までを解説します。

1. プロジェクトへの統合

まず、プロジェクトレベルの build.gradle ファイルにGreenDaoのプラグインを追加します。

buildscript {
    dependencies {
        // GreenDao プラグインの追加
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
    }
}

次に、アプリレベルの build.gradle でプラグインを適用し、ライブラリの依存関係と基本設定を記述します。

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'

android {
    // ... 既存の設定

    greendao {
        // データベースのバージョン
        schemaVersion 1
        // 自動生成されるDAOクラスのパッケージ名
        daoPackage 'com.example.app.db.gen'
        // 生成先ディレクトリの指定
        targetGenDir 'src/main/java'
    }
}

dependencies {
    implementation 'org.greenrobot:greendao:3.3.0'
}

外部ストレージにデータベースを保存する場合は、AndroidManifest.xml に適切な権限を追加してください。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2. エンティティの定義と自動生成

GreenDaoでは、Javaクラスにアノテーションを付与することで、データベースのテーブル構造を定義します。ビルドを実行すると、Getter/SetterやDAOクラスが自動生成されます。

@Entity
public class ProductItem {
    @Id(autoincrement = true)
    private Long id;

    @Unique
    private String serialNumber;

    @Property(nameInDb = "product_name")
    private String name;

    private double price;
    private int stockQuantity;
    private int categoryTag;

    // 以下、ビルド後に生成されるコードを想定
}

主要なアノテーションの役割は以下の通りです:

  • @Entity: このクラスをデータベースのテーブルとして定義します。
  • @Id: 主キーを指定します。Long型でautoincrement = trueを設定することで、自動採番が有効になります。
  • @Unique: 該当するカラムの値に一意制約を付与します。
  • @Property: データベース上のカラム名を明示的に指定します。

プロジェクトをビルド(Make Project)すると、DaoMasterDaoSession、および各エンティティに対応する ProductItemDao クラスが自動的に作成されます。

3. データベースの初期化

アプリケーションクラスなどで、データベースの接続とセッション管理を行います。

public class BaseApplication extends Application {
    private static DaoSession session;

    @Override
    public void onCreate() {
        super.onCreate();
        initDatabase();
    }

    private void initDatabase() {
        // ヘルパーの作成
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "app-records.db");
        // データベースの取得
        Database db = helper.getWritableDb();
        // セッションの確立
        session = new DaoMaster(db).newSession();
    }

    public static DaoSession getDatabaseSession() {
        return session;
    }
}

DaoMaster: データベースオブジェクトの管理と、DAOクラスの保持を担う中心的なクラスです。
DaoSession: 特定のスキーマに対するDAOオブジェクトを管理し、エンティティの挿入・削除・更新などのメソッドを提供します。

4. データベース保存先のカスタマイズ

デフォルトのアプリ内領域ではなく、SDカード等の特定のパスにデータベースを保存したい場合は、ContextWrapper を継承したクラスを作成して getDatabasePath をオーバーライドします。

public class CustomStorageContext extends ContextWrapper {
    public CustomStorageContext(Context base) {
        super(base);
    }

    @Override
    public File getDatabasePath(String dbName) {
        // 独自の保存先ディレクトリを取得(例:外部ストレージのカスタムフォルダ)
        File customDir = new File(getExternalFilesDir(null), "databases");
        
        if (!customDir.exists()) {
            customDir.mkdirs();
        }

        return new File(customDir, dbName);
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
    }
}

このカスタムコンテキストを DevOpenHelper のコンストラクタに渡すことで、指定したパスにデータベースファイルが生成されるようになります。

CustomStorageContext customContext = new CustomStorageContext(getApplicationContext());
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(customContext, "custom-path.db");
session = new DaoMaster(helper.getWritableDb()).newSession();

タグ: Android GreenDAO SQLite ORM Java

8月9日 16:01 投稿