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フォルダ
android 数据库之GreenDao使用_第1张图片
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クラスを作成します.具体的なフォーマットは上記のとおりです.
android 数据库之GreenDao使用_第2张图片
ビルドの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