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)すると、DaoMaster、DaoSession、および各エンティティに対応する 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();