きょこみのーと

技術に関係ないほうのブログ

Android Studioでgradle taskを使ってgreenDaoのDao生成を行う

はじめに

AndroidSqliteって便利だけど直接sqlをコードに書くのはちょっと抵抗ありますよね。

あとカラム追加時の修正とか色々大変。。。

参考書籍

greenDaoもそうだけど、他にも今まで知らなかったオープンソースのライブラリとか一杯乗っててとても勉強になります。 内容自体は初心者でも読めるけど、利用するとなると中級〜上級向けかな?

導入した環境

  • Android Studio 0.4.0
  • 生成したDaoを利用するプロジェクトは作成済み

導入手順

Dao生成用のgradleのみのプロジェクト?を作成する

開発中のAndroidプロジェクトを開く(Android Studioでcreateしたプロジェクト)

f:id:kyokomi:20131223195417p:plain

プロジェクトを右クリック > New > Directoryで「DaoGenerator」ディレクトリを作る。

プロジェクトを右クリック > New > Fileで「build.gradle」ファイルを作る。

f:id:kyokomi:20131223195424p:plain

Dao生成のbuild.gradleのtaskを書いちゃう。

project/DaoGenerator/build.gradle

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

// DBのバージョン
def dbVersion = 1
// 出力先のパッケージ名
def daoOutputPackage = "com.kyokomi.hogehoge.db"
// 出力先のディレクトリパス(generator実行前にcleanするのでソースは分けたほうがいい)
def daoOutputDirPath = "HogehogeApp/src-gen/main/java"

// generatorで作成したディレクトリを削除する
task daoGeneratorClean(type: Delete) {
    delete "../${daoOutputDirPath}"
}

task daoGenerator {
    description 'daoを生成します'

    doLast {
        Schema schema = new Schema(dbVersion, daoOutputPackage);

        // ------------- この辺でテーブル定義 START -------------------

        Entity hogeTable = schema.addEntity("HogeTable");

        hogeTable.addLongProperty("id").primaryKey().autoincrement().notNull().unique();
        hogeTable.addLongProperty("fuga").notNull();
        hogeTable.addStringProperty("hoge").notNull();

        // ------------- この辺でテーブル定義 END -------------------

        try {
            // 未作成ならディレクトリを作る
            File file = new File(daoOutputDirPath);
            if (!file.exists()) {
                file.mkdirs();
            }
            // Dao生成!
            new DaoGenerator().generateAll(schema, daoOutputDirPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

gradleの親子関係を設定

プロジェクト直下のgradle設定ファイルにDaoGeneratorを追加(もしかしたら自動でAndroidStudioが追加するかも)

project/settings.gradle

include ':DaoGenerator' 

親からtaskを実行する時の子のbuild設定

プロジェクト直下のgradleのbuild設定にDaoGeneratorを追加。

project/build.gradle

project(':DaoGenerator') {
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'de.greenrobot:greendao:1.3.7'
            classpath 'de.greenrobot:greendao-generator:1.3.0'
            classpath 'org.freemarker:freemarker:2.3.19'
        }
    }
}

生成したDaoをアプリで使用する設定

今回生成したDaoを使用するアプリプロジェクトのbuild.gradleも修正。関係ない部分は省略してます。

project/HogeHogeApp/build.gradle

buildscript {
     // 〜省略〜
}

// 〜省略〜

android {

    // 〜省略〜

    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src-gen/main/java']
        }
    }
}

dependencies {
    compile 'de.greenrobot:greendao:1.3.7'
}

終わり

メニューバーの「Sync Project with Gradle Files」でgradle buildする。

f:id:kyokomi:20131223195426p:plain

こんな感じになってたら大丈夫。

f:id:kyokomi:20131223195421p:plain

とまあ、環境作って終わってしまった。 Android Studioがツンデレすぎて苦戦しまくった。。。

次回は、この運用でDao生成して組み込んで実装しやすいかとかまとめられればと思います。