2017年 Android の ORM は、DbFlow に決まったと確信しました。
あまりにも導入しやすいく、あまりにも移行しやすく、あまりにもコードが簡単になる。
感動しました。
自分にとっての ORM はスピードは二の次です。
簡単に管理、コーディング出来ることが最優先です。
Create table やら、OpenDatabase やら、 Open Cursor はもやは不要です。
項目定義もクラス定義することで完了です。
感動です。
なので、使い方を紹介します。
詳しくは
https://www.gitbook.com/book/agrosner/dbflow/details
project gradle
allProjects { repositories { // required to find the project's artifacts maven { url "https://www.jitpack.io" } } }
app gradle
def dbflow_version = "4.0.5" dependencies { apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}" }
db class
@Database(name = HatuonDb.NAME, version = HatuonDb.VERSION, generatedClassSeparator = "_") public class HatuonDb { public static final String NAME = "pronunce"; public static final int VERSION = 1; }
table class
@Table(database = HatuonDb.class, name="T_WORD") public class Word extends BaseModel { @PrimaryKey(autoincrement = true) public long id; @Column public String word; @Column public String type; @Column public String kigou; @Column public int ngCount; @Column public int okCount; @Column public int average; @Column public String japanese; @Column public long createdTimeMillis; }
application class
必要なのは、FlowManager.init(this); のみ
他のコードは、SD Card に DB を保存する為にコードです。
public class MyApplication extends android.app.Application { @Override public void onCreate() { super.onCreate(); // PronunceDbExtract(); FlowManager.init(this); } @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { return super.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), mode, factory); } @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { return super.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), mode, factory, errorHandler); } @Override public boolean deleteDatabase(String name) { return super.deleteDatabase(getDatabasePath(name).getAbsolutePath()); } @Override public File getDatabasePath(String name) { File file = new File(Environment.getExternalStorageDirectory(), name); return file; } /* protected void MyDbExtract() { String outFile = Environment.getExternalStorageDirectory() +"/" + HatuonDb.NAME + ".db"; if(!new File(outFile).exists()) { FileUtils.copyAssetsFile(getApplicationContext(), "db/hatuon.db", outFile); } } */ }
使い方
// 項目名は、 Table名_item で自動生成してくれる // select * from word where okCOunt = 0 and ngCount = 0 List list = SQLite.select().from(Word.class).where(Word_Table.okCount.eq(0)).and(Word_Table.ngCount.eq(0)).queryList(); // update word set ngCount = ngcount + 1, average = 50 where id = XXX Word word = list.get(0); word.ngCount = word.ngCount + 1; word.average = 50; word.save; // count int count = SQLite.selectCountOf().from(Word.class).count(); // in List<String> wordList = Arrays.asList(sentence.split(" ")); List<HatuonKigou> words = new Select().from(HatuonKigou.class) .where(HatuonKigou_Table.word.in(wordList)) .queryList(); Log2.e( new Select().from(HatuonKigou.class) .where(HatuonKigou_Table.word.in(wordList)) .getQuery() .toString()); // delete String category = "sentence_5"; SQLite.delete().from(Sentence.class).where(Sentence_Table.category.eq(category)).async().execute(); // sort + count Sentence list = SQLite.select().from(Sentence.class) .where() .and(Sentence_Table.isWord.eq(isWord)) .and(Sentence_Table.category.eq(category)) .orderBy(Sentence_Table.average, true) .limit(30) .queryList();
詳しくは、こちらを
ORM は、色々ありますが、すでに、開発が終了していたり、使うときにさらに別クラス宣言が必要だったり、
導入が面倒だったり、自動生成されるクラスが生成されなかったり、なんか良いのないのかと一生懸命
さがしました。realm も試しましたが、スキーマを静的に変えようとおもってもツールが見つから
なかったりと、そんななかで DbFlow を見つけました。
SQLite なら静的にスキーマを変えるツールもたくさんあるし、楽ちんです。
コードは、半減します。
ぜひお試しあれ
ただ、最大の欠点は、iOS 版が無いんですよね