天天看點

Android GreenDAO使用總結以及封裝使用

前言

總所周知,GreenDAO這個資料庫架構在Android中是非常出名的,是基于sqlite進行封裝的,GreenDAO是一個對象關系映射(ORM)的架構,能夠提供一個接口通過操作對象的方式去操作關系型資料庫,讓操作資料庫時更簡單、更友善。

Android GreenDAO使用總結以及封裝使用

GreenDao對外提供的核心類有:

DaoMaster:DaoMaster儲存資料庫對象(SQLiteDatabase)并管理特定模式的Dao類。它具有靜态方法來建立表或将他們删除。其内部類OpenHelper和DevOpenHelper是在SQLite資料庫中建立模式的

SQLiteOpenHelper實作。

DaoSession:管理特定模式的所有可用Dao對象,還為實體提供了一些通用的持久性方法,如插入,加載,更新,重新整理和删除。

Dao:資料通路對象(Dao)持續存在并查詢實體。對于每個實體,GreenDao生成一個Dao,它比DaoSession有更多的持久化方法。

實體:持久對象,通常實體是使用标準Java屬性(如POJO或JavaBean)來表示資料庫的對

一、依賴添加

1.project 的 build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        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
    }
           

2.app的build.gradle或者library中的build.gradle:

apply plugin: 'com.android.library'
apply plugin: 'org.greenrobot.greendao'

android {
    compileSdkVersion 28


    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    greendao {
        //資料庫版本号,更新時修改
        schemaVersion 1
        //生成的DAO,DaoMaster和DaoSession的包路徑。預設與表實體所在的包路徑相同
        daoPackage 'greendao.gen'
        //生成源檔案的路徑。預設源檔案目錄是在build目錄中的(build/generated/source/greendao)
        targetGenDir 'src/main/java'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    //資料庫加密
    implementation 'net.zetetic:android-database-sqlcipher:[email protected]'
    /*greenDao資料庫*/
    implementation 'org.greenrobot:greendao:3.2.2'
    /*資料庫版本更新*/
    implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0'

}
           

二、代碼封裝

1.定義資料庫操作接口,Operation

import java.util.List;

public interface Operation<T, K> {

    void insert(T t);

    void insertOrReplace(T t);

    void insertOrReplaceInTx(Iterable<T> entities);

    void deleteByKey(K k);

    void delete(T t);

    void deleteInTx(Iterable<T> entities);

    void deleteAll();

    T load(K key);

    List<T> loadAll();

}
           

2.使用基類實作接口,BaseOperation

import org.greenrobot.greendao.AbstractDao;

import java.util.List;


public abstract class BaseOperation<T, K, R extends AbstractDao<T, K>> implements Operation<T, K> {


    public abstract R getDao();

    @Override
    public void insert(T t) {
        if (t != null) {
            getDao().insert(t);
        }
    }

    @Override
    public void insertOrReplace(T t) {
        if (t != null) {
            getDao().insertOrReplace(t);
        }
    }

    @Override
    public void insertOrReplaceInTx(Iterable<T> entities) {
        if (entities != null) {
            getDao().insertOrReplaceInTx(entities);
        }
    }

    @Override
    public void deleteByKey(K k) {
        if (k != null) {
            getDao().deleteByKey(k);
        }
    }

    @Override
    public void delete(T t) {
        if (t != null) {
            getDao().delete(t);
        }
    }

    @Override
    public void deleteInTx(Iterable<T> entities) {
        if (entities != null) {
            getDao().deleteInTx(entities);
        }
    }

    @Override
    public void deleteAll() {
        getDao().deleteAll();
    }

    @Override
    public T load(K key) {
        if (key != null) {
            return getDao().load(key);
        }
        return null;
    }

    @Override
    public List<T> loadAll() {
        return getDao().loadAll();
    }


}
           

3.DaoHelper資料庫操作幫助類

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DaoHelper {

    private static DaoSession daoSession;


    public static void init(Context context) {
        UpdateDatabaseHelper devOpenHelper = new UpdateDatabaseHelper(context,     Constant.DB_NAME, null);
        SQLiteDatabase sqLiteDatabase = devOpenHelper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(sqLiteDatabase);
        daoSession = daoMaster.newSession();
    }

   
    public static DaoSession getDaoSession() {
        if (daoSession != null) {
            daoSession.clear();//清理緩存
        }
        return daoSession;
    }

    public static boolean isDaoSessionNull() {
        return daoSession == null;
    }
 
  }
           

4.具體使用,UserDao繼承BaseOperation

(1)建立User實體類

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;

@Entity
public class User {

    @Id(autoincrement = true)
    private Long id;

    private String userId;

    private String userName;

    private String userType;

    private String password;

    private String gesturePw;

    private String roleId;

    private String roleName;

    private String remark;

    private String epc;

    private String tid;

    private long createTime;

    @Generated(hash = 1698394073)
    public User(Long id, String userId, String userName, String userType,
            String password, String gesturePw, String roleId, String roleName,
            String remark, String epc, String tid, long createTime) {
        this.id = id;
        this.userId = userId;
        this.userName = userName;
        this.userType = userType;
        this.password = password;
        this.gesturePw = gesturePw;
        this.roleId = roleId;
        this.roleName = roleName;
        this.remark = remark;
        this.epc = epc;
        this.tid = tid;
        this.createTime = createTime;
    }

    @Generated(hash = 586692638)
    public User() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserId() {
        return this.userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserType() {
        return this.userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGesturePw() {
        return this.gesturePw;
    }

    public void setGesturePw(String gesturePw) {
        this.gesturePw = gesturePw;
    }

    public String getRoleId() {
        return this.roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public String getRoleName() {
        return this.roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRemark() {
        return this.remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getEpc() {
        return this.epc;
    }

    public void setEpc(String epc) {
        this.epc = epc;
    }

    public String getTid() {
        return this.tid;
    }

    public void setTid(String tid) {
        this.tid = tid;
    }

    public long getCreateTime() {
        return this.createTime;
    }

    public void setCreateTime(long createTime) {
        this.createTime = createTime;
    }

}
           

(2)建立UserOperation類,繼承 BaseOperation

import java.util.List;

import database.dense_shelf_db.BaseOperation;
import database.dense_shelf_db.DenseFrameDb;
import database.dense_shelf_db.entity.User;
import database.dense_shelf_db.gen.UserDao;

public class UserOperation extends BaseOperation<User, Long, UserDao> {

    @Override
    public UserDao getDao() {
        return DenseFrameDb.getUserDao();
    }


    public User getTidUser(String tid) {
        List<User> userList = getDao().queryBuilder().where(UserDao.Properties.Tid.eq(tid)).list();
        if (userList.size() > 0) {
            return userList.get(0);
        }
        return null;
    }


    public User loadByUserName(String userName) {
        if (userName != null) {
            List<User> userList = getDao().queryBuilder().where(UserDao.Properties.UserName.eq(userName)).list();
            if (userList.size() > 0) {
                return userList.get(0);
            }
        }
        return null;
    }

    public User loadByUserId(String userId) {
        if (userId != null) {
            List<User> userList = getDao().queryBuilder().where(UserDao.Properties.UserId.eq(userId)).list();
            if (userList.size() > 0) {
                return userList.get(0);
            }
        }
        return null;
    }

    public List<User> getAllUser() {
        return getDao().queryBuilder().orderAsc(UserDao.Properties.Id).list();
    }

}
           

5.資料庫更新

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.github.yuweiguocn.library.greendao.MigrationHelper;

import org.greenrobot.greendao.database.Database;

import database.dense_shelf_db.gen.UserDao;

public class UpdateDatabaseHelper extends DaoMaster.OpenHelper {

    public UpdateDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {

        super(context, name, factory);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {

        super.onUpgrade(db, oldVersion, newVersion);
        MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
                    @Override
                    public void onCreateAllTables(Database db, boolean ifNotExists) {

                        DaoMaster.createAllTables(db, ifNotExists);
                    }

                    @Override
                    public void onDropAllTables(Database db, boolean ifExists) {

                        DaoMaster.dropAllTables(db, ifExists);
                    }
                },
                UserDao.class);
    }

}
           

注意事項

若改動資料庫實體類字段,需要更新資料庫版本!!!

greendao {
        //資料庫版本号,更新時修改
        schemaVersion 1
        //生成的DAO,DaoMaster和DaoSession的包路徑。預設與表實體所在的包路徑相同
        daoPackage 'greendao.gen'
        //生成源檔案的路徑。預設源檔案目錄是在build目錄中的(build/generated/source/greendao)
        targetGenDir 'src/main/java'
    }
           

就這樣吧,有項目就搞起,沒事就摸魚!!!