我的GreenDao使用筆記

前言

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。

GreenDao核心關係

(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" 不爲空

 

 

五、完結。如有問題請留言,如覺得不錯可以點個贊。共勉。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章