前言
總所周知,GreenDAO這個資料庫架構在Android中是非常出名的,是基于sqlite進行封裝的,GreenDAO是一個對象關系映射(ORM)的架構,能夠提供一個接口通過操作對象的方式去操作關系型資料庫,讓操作資料庫時更簡單、更友善。
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'
}
就這樣吧,有項目就搞起,沒事就摸魚!!!