我的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相关工具

我的GreenDao使用笔记_第1张图片

(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张图片

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

 

 

五、完结。如有问题请留言,如觉得不错可以点个赞。共勉。

 

 

 

 

 

你可能感兴趣的:(Android)