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
(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定义与多个实体对象的关系;
(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();
}
}
(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" 不为空