AndroidデータベースのGreenDao使用
GreenDao
公式サイトアドレス:http://greenrobot.org/greendao/
githubアドレス:https://github.com/greenrobot/greenDAO
GreenDaoのメリット:
1クエリ効率が高い
2メモリ消費量が小さい
3統合が便利
使用方法:
1参照(1つも少なくできません)
アプリの下のbuild.gradle
忘れちゃいけない!
apply plugin: 'org.greenrobot.greendao'//
android {
greendao {
schemaVersion 1
daoPackage 'com.tongyonghangkong.greendao.gen'// gen ,
targetGenDir 'src/main/java'
}
}
dependencies {
implementation 'org.greenrobot:greendao:3.1.0'
implementation 'org.greenrobot:greendao-generator:3.1.0'
implementation 'com.jakewharton:butterknife:8.1.0'
}
プロジェクトの下のbuild.gradle
忘れてはいけない
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
mavenCentral()//
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven{url "https://jitpack.io"}//
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2 greendaoを手動で作成する.GreenDaoによって自動的に生成されたコードを格納するgenフォルダ
3グリーンデーの初期化
まず2つのクラスを用意します:DaoMaster DaoSession
package com.tongyonghangkong.greendao.gen;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
import org.greenrobot.greendao.AbstractDaoMaster;
import org.greenrobot.greendao.database.StandardDatabase;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.DatabaseOpenHelper;
import org.greenrobot.greendao.identityscope.IdentityScopeType;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* Master of DAO (schema version 1): knows all DAOs.
*/
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 1;
/** Creates underlying database table using DAOs. */
public static void createAllTables(Database db, boolean ifNotExists) {
ZhenHangDao.createTable(db, ifNotExists);
WokersDao.createTable(db, ifNotExists);
}
/** Drops underlying database table using DAOs. */
public static void dropAllTables(Database db, boolean ifExists) {
ZhenHangDao.dropTable(db, ifExists);
WokersDao.dropTable(db, ifExists);
}
/**
* WARNING: Drops all table on Upgrade! Use only during development.
* Convenience method using a {@link DevOpenHelper}.
*/
public static DaoSession newDevSession(Context context, String name) {
Database db = new DevOpenHelper(context, name).getWritableDb();
DaoMaster daoMaster = new DaoMaster(db);
return daoMaster.newSession();
}
public DaoMaster(SQLiteDatabase db) {
this(new StandardDatabase(db));
}
public DaoMaster(Database db) {
super(db, SCHEMA_VERSION);
registerDaoClass(ZhenHangDao.class);
registerDaoClass(WokersDao.class);
}
public DaoSession newSession() {
return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
}
public DaoSession newSession(IdentityScopeType type) {
return new DaoSession(db, type, daoConfigMap);
}
/**
* Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
*/
public static abstract class OpenHelper extends DatabaseOpenHelper {
public OpenHelper(Context context, String name) {
super(context, name, SCHEMA_VERSION);
}
public OpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory, SCHEMA_VERSION);
}
@Override
public void onCreate(Database db) {
Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
createAllTables(db, false);
}
}
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super(context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
}
package com.tongyonghangkong.greendao.gen;
import java.util.Map;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.AbstractDaoSession;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.identityscope.IdentityScopeType;
import org.greenrobot.greendao.internal.DaoConfig;
import com.tongyonghangkong.bean.ZhenHang;
import com.tongyonghangkong.bean.Wokers;
import com.tongyonghangkong.greendao.gen.ZhenHangDao;
import com.tongyonghangkong.greendao.gen.WokersDao;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* {@inheritDoc}
*
* @see org.greenrobot.greendao.AbstractDaoSession
*/
public class DaoSession extends AbstractDaoSession {
private final DaoConfig zhenHangDaoConfig;
private final DaoConfig wokersDaoConfig;
private final ZhenHangDao zhenHangDao;
private final WokersDao wokersDao;
public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig>
daoConfigMap) {
super(db);
zhenHangDaoConfig = daoConfigMap.get(ZhenHangDao.class).clone();
zhenHangDaoConfig.initIdentityScope(type);
wokersDaoConfig = daoConfigMap.get(WokersDao.class).clone();
wokersDaoConfig.initIdentityScope(type);
zhenHangDao = new ZhenHangDao(zhenHangDaoConfig, this);
wokersDao = new WokersDao(wokersDaoConfig, this);
registerDao(ZhenHang.class, zhenHangDao);
registerDao(Wokers.class, wokersDao);
}
public void clear() {
zhenHangDaoConfig.getIdentityScope().clear();
wokersDaoConfig.getIdentityScope().clear();
}
public ZhenHangDao getZhenHangDao() {
return zhenHangDao;
}
public WokersDao getWokersDao() {
return wokersDao;
}
}
グリーンにコピーgenのクラスの後、APPlicationでgreenDaoを初期化する:setDatabase()メソッドを呼び出す
private void setDatabase() {
mHelper = new DaoMaster.DevOpenHelper(this, "notes_db", null);
db = mHelper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
4あなたのテーブルの作成を開始
package com.tongyonghangkong.bean;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
/**
* Created by Administrator on 2019/3/12.
*/
@Entity
public class Wokers {
@Id
public Long id;
public String name;
public String age;
public String sex;
}
beanクラスを作成します.具体的なフォーマットは上記のとおりです.
ビルドのMakeプロジェクトをクリックすると、自動的に生成されるファイル:
package com.tongyonghangkong.greendao.gen;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.Property;
import org.greenrobot.greendao.internal.DaoConfig;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.DatabaseStatement;
import com.tongyonghangkong.bean.ZhenHang;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* DAO for table "ZHEN_HANG".
*/
public class ZhenHangDao extends AbstractDao {
public static final String TABLENAME = "ZHEN_HANG";
/**
* Properties of entity ZhenHang.
* Can be used for QueryBuilder and for referencing column names.
*/
public static class Properties {
public final static Property Id = new Property(0, Long.class, "id", true, "_id");
public final static Property Name = new Property(1, String.class, "name", false, "NAME");
public final static Property Age = new Property(2, int.class, "age", false, "AGE");
public final static Property Sex = new Property(3, String.class, "sex", false, "SEX");
};
public ZhenHangDao(DaoConfig config) {
super(config);
}
public ZhenHangDao(DaoConfig config, DaoSession daoSession) {
super(config, daoSession);
}
/** Creates the underlying database table. */
public static void createTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "\"ZHEN_HANG\" (" + //
"\"_id\" INTEGER PRIMARY KEY ," + // 0: id
"\"NAME\" TEXT NOT NULL ," + // 1: name
"\"AGE\" INTEGER NOT NULL ," + // 2: age
"\"SEX\" TEXT);"); // 3: sex
}
/** Drops the underlying database table. */
public static void dropTable(Database db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"ZHEN_HANG\"";
db.execSQL(sql);
}
@Override
protected final void bindValues(DatabaseStatement stmt, ZhenHang entity) {
stmt.clearBindings();
Long id = entity.getId();
if (id != null) {
stmt.bindLong(1, id);
}
stmt.bindString(2, entity.getName());
stmt.bindLong(3, entity.getAge());
String sex = entity.getSex();
if (sex != null) {
stmt.bindString(4, sex);
}
}
@Override
protected final void bindValues(SQLiteStatement stmt, ZhenHang entity) {
stmt.clearBindings();
Long id = entity.getId();
if (id != null) {
stmt.bindLong(1, id);
}
stmt.bindString(2, entity.getName());
stmt.bindLong(3, entity.getAge());
String sex = entity.getSex();
if (sex != null) {
stmt.bindString(4, sex);
}
}
@Override
public Long readKey(Cursor cursor, int offset) {
return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
}
@Override
public ZhenHang readEntity(Cursor cursor, int offset) {
ZhenHang entity = new ZhenHang( //
cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
cursor.getString(offset + 1), // name
cursor.getInt(offset + 2), // age
cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3) // sex
);
return entity;
}
@Override
public void readEntity(Cursor cursor, ZhenHang entity, int offset) {
entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
entity.setName(cursor.getString(offset + 1));
entity.setAge(cursor.getInt(offset + 2));
entity.setSex(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
}
@Override
protected final Long updateKeyAfterInsert(ZhenHang entity, long rowId) {
entity.setId(rowId);
return rowId;
}
@Override
public Long getKey(ZhenHang entity) {
if(entity != null) {
return entity.getId();
} else {
return null;
}
}
@Override
protected boolean hasKey(ZhenHang entity) {
return false;
}
@Override
protected final boolean isEntityUpdateable() {
return true;
}
}
データの挿入例:
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.insert(user);
データの削除例:
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.delete(user);
データの更新例:
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.update(user);
検索データの例:
public List queryUserList() {
DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
QueryBuilder qb = userDao.queryBuilder();
List list = qb.list();
return list;
}
エラー解決:
1 android.database.sqlite.SQLiteException: no such table: TASK_SCAN (code 1): , while compiling: SELECT T."_id",T."TASKID",T."TASKCARDID",T."TASKSTATUS"FROM "TASK_SCAN"……………………
GreenDaoの使用中に、データクラスPersonを新規作成し@Entityと表記し、フレームワークでPersonDaoを自動的に生成しました.私はこのDaoクラスを使用してPersonテーブルを操作し、携帯電話にインストールしてこのエラーを報告しました.
このテーブルがないという情報を間違えて、私はとても憂鬱で、アプリケーションが起動するたびにフレームワークがすべてのデータテーブルを自動的にチェックして、新しいデータクラスをデータベースにマッピングしませんか?実践的な証明はできません.最初のインストールを適用したときだけ、データベースにテーブルを新規作成し、開発中に現在のapkを削除してインストールを再実行すればいいです.
解決策も明らかになったので、携帯電話の既存のAPKを削除してインストールすればいい.
転載先:http://blog.csdn.net/zhang___yong/article/details/77948150