前言
Android項目Android studio環境:
1、工程build.gradle版本號:3.2.1
2、app目錄下的build.gradle配置:compileSdkVersion 28
minSdkVersion 16
targetSdkVersion 28
測試機型:魅藍note2 android5.1.1
華爲榮耀暢玩7x android8.0.0
一、配置build.gradle文件
(1)引入greendao的第三方庫到dependencies中,版本號:3.2.2
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
.........
implementation 'org.greenrobot:greendao:3.2.2'
}
(2)在項目src/main/java目錄下創建greenGen文件夾,用來放置greendao相關工具
(3)同(2)將創建好的文件夾配置在build.gradle的android中
android {
.........
testOptions {
unitTests.returnDefaultValues = true
}
greendao {
schemaVersion 1
daoPackage 'com.itouch.myfirstdemo.greenGen'
targetGenDir 'src/main/java'
}
dataBinding {
enabled = true
}
}
二、開始創建存儲對象實體類
(1)GreenDao分三個類:DaoMaster.java、DaoSession.java、XXXDao.java。這三個類會自動創建,不需要自己編寫代碼,具體如下操作。
a、DaoMaster:保存數據庫對象,即SQLiteDataBase。並且創建靜態方法來建表、刪除等管理特定模式的DAO類,其中在SQLite數據庫中創建模式,通過SQLiteOpenHelper來實現OpenHelper和DevOpenHelper的內部類。
b、DaoSession:提供通用的持久性的方法,如實體的插入、加載、更新、刷新和刪除等來管理特定模式的可用DAO對象,可通過getter方法獲取該對象。
c、XXXDao:數據直接訪問的對象,並且持久存在的查詢實體。對於每個實體而言,是由GreenDao生成的DAO,它具有比DaoSession更多的持久性方法,如:insert、loadAll、update等。
d、XXXEntity:可持久化對象。一般實體對象代表數據庫行使用標準,類似於JavaBean。
(2)創建存儲對象XXXEntity.java實體類。
@Entity
public class StoreLists {
@Id
private Long id;
@NotNull
private String appIcon;
@NotNull
private String appName;
@NotNull
private String appDownloadUrl;
@NotNull
private String appStatus;
@NotNull
private String appNumber;
@NotNull
private String appAccount;
//todo:接下來無需手動編碼
}
存儲對象寫完之後,直接rebuild或者run項目即可自動生成DaoMaster.java、DaoSession.java、XXXDao.java,且XXXEntity.java的getter和setter方法也會自動生成。
注意:
a、GreenDao必要代碼:在存儲數據類最前面聲明@Entity註解,只有添加了@Entity註解GreenDao纔會創建對應的表;
@Entity{
schema = "mySchema", //屬於哪個架構
active = true, //標記實體處於活躍狀態,活躍實體有更新、刪除、刷新等方法
nameInDb = "AWESOME_USERS", //在數據中使用的別名,默認使用的是實體類名
indexes = {
@Index(value = "message DESC", unique = true)
//標記如果DAO應該創建數據庫表(默認爲true),如果您有多個實體映射到一個表,或者表的創建是在 greenDAO之外進行的,那麼將其設置爲false
},
createInDb = false, //標記創建數據庫表
generateConstructors = true, //生成構造函數
generateGettersSetters = true //如果缺少,是否應生成屬性的getter和setter方法
}
public class StoreLists {
.........
}
b、基礎屬性註解「@Id、@Property、@NotNull、@Transient」和索引註解「@Index、@Unique」;
@Entity
public class StoreLists {
@Id(autoincrement = true) //選擇long/Long屬性作爲實體ID,自增
@Unique //向索引添加UNIQUE約束,強制所有值都是唯一的
private Long id; //id必須是Long,爲long不行
@NotNull //設置數據庫表當前列不能爲空
private String appIcon;
@Property (nameInDb="appName") //允許定義屬性映射到的非默認列名,當前只能使用內聯常量來指定列名
@Index(unique = true) //作爲一個屬性來創建一個索引,通過name設置索引別名,也可以通過unique給索引添加約束
private String appName;
}
c、關係註解「@ToOne、@ToMany」,其中@ToOne是定義與另一個實體的關係;@ToMany定義與多個實體對象的關係;
三、在application中初始化GreenDao
(1)將自動生成的DaoMaster.java、DaoSession.java進行簡單的封裝,工具類GreenDaoManager.java;
public class GreenDaoManager {
private static volatile GreenDaoManager mInstance; //單例
private DaoMaster mDaoMaster; //以一定的模式管理Dao類的數據庫對象
private DaoSession mDaoSession; //管理制定模式下的所有可用Dao對象
public GreenDaoManager() {
//初始化建議放在Application中進行
if (mInstance == null) {
//創建數據庫"note.db"
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(BaseApplication.getInstance(), "note.db", null);
//獲取可寫數據庫
SQLiteDatabase database = devOpenHelper.getWritableDatabase();
//獲取數據庫對象
mDaoMaster = new DaoMaster(database);
//獲取Dao對象管理者
mDaoSession = mDaoMaster.newSession();
}
}
public static GreenDaoManager getInstance() {
if (mInstance == null) {
//保證異步處理安全操作
synchronized (GreenDaoManager.class) {
if (mInstance == null) {
mInstance = new GreenDaoManager();
}
}
}
return mInstance;
}
public DaoMaster getDaoMaster() {
return mDaoMaster;
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public DaoSession getNewSession() {
mDaoSession = mDaoMaster.newSession();
return mDaoSession;
}
}
(2)在application的oncreate()方法中直接調用方法即可;
public class BaseApplication extends MultiDexApplication {
private static BaseApplication instance;
public static BaseApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
//初始化GreenDao
GreenDaoManager.getInstance();
}
}
四、使用GreenDao操作增刪改查
(1)增「insert()、insertOrReplace()」
a、insert():插入數據。
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void insertData(StoreLists store) {
daoManager.getDaoSession().getStoreListsDao().insert(store);
}
}
b、insertOrReplace():數據存在則替換,數據不存在則插入。
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void insertOrReplaceData(StoreLists store) {
daoManager.getDaoSession().getStoreListsDao().insertOrReplace(store);
}
}
(2)刪「delete()、deleteAll()、deleteByKey()」
a、delete():刪除單個數據
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void deleteData(StoreLists store) {
daoManager.getDaoSession().getStoreListsDao().delete(store);
}
}
b、deleteAll():刪除全部數據
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void deleteAllData(StoreLists store) {
daoManager.getDaoSession().getStoreListsDao().deleteAll(store);
}
}
c、deleteByKey():通過ID刪除對應數據
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void deleteData(long id) {
daoManager.getDaoSession().getStoreListsDao().deleteByKey(id);
}
}
(3)改「update()」,修改數據
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void updateData(StoreLists store) {
daoManager.getDaoSession().getStoreListsDao().update(store);
}
}
注意:
在開發的過程中直接調用update()的方法出現了錯誤「cannot update entity without key - was it inserted before?」,經過debug發現拋出該異常的原因是在調用update()時傳入的主鍵爲 null,於是自己將
ID設置成自增長,結果還是無效。
最終解決辦法是自己編碼設置一個ID就解決了,如果有道友遇到跟我一樣的問題,可以試一下這個解決的辦法。
for (int i = 0; i < alreadyApp.size(); i++) {
StoreLists modelDao = new StoreLists();
//設置ID
modelDao.setId(iL);
modelDao.setAppIcon("ic_icon");
modelDao.setAppName("移動辦公");
modelDao.setAppDownloadUrl("");
modelDao.setAppStatus("0");
modelDao.setAppAccount(alreadyApp.get(i).getOsaccount());
modelDao.setAppNumber(alreadyApp.get(i).getOsnumber());
//修改數據
MyAppStoreDao.updateData(modelDao);
}
(4)查「loadAll()、queryRaw()、queryBuilder()」
a、loadAll():查詢所有數據
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static List<StoreLists> queryAll() {
return daoManager.getDaoSession().getStoreListsDao().loadAll();
}
}
b、queryRaw():根據條件查詢
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
public static void queryRawData(String s) {
List<StoreLists> storeLists = daoManager.getDaoSession().queryRaw(StoreLists.class, " where id = ?", s);
mDataBaseAdapter.addStoreData(storeLists);
}
}
c、queryBuilder():方便查詢的創建
public class MyAppStoreDao {
private static GreenDaoManager daoManager = GreenDaoManager.getInstance();
//查詢os_number不爲空的數據(按照id升序排序)
public static List<StoreLists> queryNumberNotNullData() {
return daoManager.getDaoSession().getStoreListsDao().queryBuilder()
.where(StoreListsDao.Properties.AppNumber.notEq(""))
.orderAsc(StoreListsDao.Properties.Id)
.build().list();
}
}
注意:
(1)一般查詢使用的queryBuilder()多一點,常見的方法「where、or、and、join、list()、listLazy()、listLazyUncached()、listIterator()、orderAsc()、orderDesc()」
a、where:查詢條件,參數爲查詢的條件
b、or:嵌套條件或者
c、and:嵌套條件且
d、join:多表查詢
e、list():所有實體都加載到內存中。結果通常是一個沒有魔法的 ArrayList
f、listLazy():實體按需加載到內存中,首次訪問列表中的元素後,將加載並緩存該元素以供將來使用。必須關閉
g、listLazyUncached():實體的“虛擬”列表,對列表元素的任何訪問都會導致從數據庫加載其數據。必須關閉
h、listIterator():通過按需加載數據(懶惰)來迭代結果。數據未緩存。必須關閉。
i、orderAsc():按某個屬性升序排
j、orderDesc():按某個屬性降序排
(2)語句條件縮寫
a、eq():"equal ('=?')" 等於
b、notEq() :"not equal ('<>?')" 不等於
c、like():" LIKE ?" 值等於
d、between():" BETWEEN ? AND ?" 取中間範圍
e、in():" IN (" in命令
f、notIn():" NOT IN (" not in 命令
g、gt():">?" 大於
h、lt():"<? " 小於
i、ge():">=?" 大於等於
j、le():"<=? " 小於等於
k、isNull():" IS NULL" 爲空
l、isNotNull():" IS NOT NULL" 不爲空
五、完結。如有問題請留言,如覺得不錯可以點個贊。共勉。