一:什么是GreenDao
1.官网地址:https://github.com/greenrobot/greenDAO
2.greenDAO通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),可以使用简单的面向对象API来存储、更新、删除和查询Java对象。
二:效果
三:GreenDao使用
1.在项目中的整体build.gradle使用添加依赖
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin
}
}
2:在app/build.gradle中添加依赖
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.3.0' // add library
}
3:添加完依赖后,使用GreenDao
- 创建实体类
- 生成对应的DaoMaster,DaoSession,Dao。可以在build文件下看到
- 通过Dao对象完成增删改查
4:新建model包,定义一个实体类,创建GoodsModel类
private Long id;
private Integer goodsId;
private String name;
private String icon;
private String info;
private String type;
通过点击的MakeProject,便发现GreenDao为我们的GoodsModel实体类生成了对应的Getter、Setter方法以及俩个构造函数,同时在我们配置的com.ping.greendao.gen包下生成了三个对应类文件DaoMaster、DaoSession和MeiziDao,之后所有相关的数据库操作都依靠这三个文件了
- @Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类;
- @NotNull–设置表中当前列的值不可为空
- @ConVert–指定自定义类型(@link PropertyConverter)
- @Id–主键Long型,可以通过@Id(autoincrement=ture)实现增长
- @Index–创建一个索引
- @JoinEntity–定义表连接关系
- @Unique–先数据库添加一个唯一约束
- @OrferBy–指定排序
5:通过Application创建全局,数据库对象,包含创建数据库、创建数据库表
- DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类
- DaoSession管理特定模式的所有可用Dao对象,可以使用其中一个getter方法获取
package com.hanjie.greendao_2021_0423;
import android.app.Application;
import com.hanjie.greendao_2021_0423.model.DaoMaster;
import com.hanjie.greendao_2021_0423.model.DaoSession;
import org.greenrobot.greendao.database.Database;
public class MyApplication extends Application {
public static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
initDb();
}
public void initDb () {
// 获取SQLiteOpenHelper对象devOpenHelper
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "hanjie.db");
// 获取SQLiteDatabase
//SQLiteDatabase db = devOpenHelper.getWritableDatabase();
// 加密数据库
Database database = devOpenHelper.getEncryptedWritableDb("12345");
// 创建DaoMaster实例
// DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类(而不是对象)。
// 它具有静态方法来创建表或将它们删除。
// 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。
DaoMaster daoMaster = new DaoMaster(database);
// 管理特定模式的所有可用Dao对象
daoSession = daoMaster.newSession();
}
}
六:编写DaoManager,用于增删改查的操作以及数据库的升级。新建assets文件夹,添加数据来源
package com.hanjie.greendao_2021_0423.manager;
import android.content.Context;
import com.hanjie.greendao_2021_0423.MyApplication;
import com.hanjie.greendao_2021_0423.model.GoodsModel;
import com.hanjie.greendao_2021_0423.model.GoodsModelDao;
import com.hanjie.greendao_2021_0423.utils.DataUtils;
import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
public class GreenDaoManager {
private Context mContext;
private GoodsModelDao mGoodsModelDao;
public GreenDaoManager(Context context){
mContext = context;
mGoodsModelDao = MyApplication.daoSession.getGoodsModelDao();
}
//添加数据到数据库
public void insertGoods () {
String json = DataUtils.getJson("goods.json", mContext);
// 因为重复添加数据而导致崩溃,可以使用insertOrReplaceInTx API
// mGoodsModelDao.insertInTx(DataUtils.getGoodsModels(json));
mGoodsModelDao.insertOrReplaceInTx(DataUtils.getGoodsModels(json));
}
//查询所有
public List<GoodsModel> queryGoods(){
QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder()
.orderAsc(GoodsModelDao.Properties.GoodsId);
return query.list();
}
//查询水果
public List<GoodsModel> queryFruits(){
QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();
query = query.where(GoodsModelDao.Properties.Type.eq("0"))
.orderAsc(GoodsModelDao.Properties.GoodsId);;
return query.list();
}
//查询零食
public List<GoodsModel> querySnacks(){
QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();
query = query.where(GoodsModelDao.Properties.Type.eq("1"))
.orderAsc(GoodsModelDao.Properties.GoodsId);;
return query.list();
}
//删除指定数据
public void deleteGoodsInfo(GoodsModel goodsModel){
mGoodsModelDao.delete(goodsModel);
}
public void updateGoodsInfo(GoodsModel goodsModel){
mGoodsModelDao.update(goodsModel);
}
}
七:在主方法中调用,插入到数据库,将查询显示到界面上
1.插入和查询
//按钮的点击事件
public void onAddGoodsClick (View v) {
mDBManager.insertGoods();
}
/**
* 查询全部商品
* @param v
*/
public void onQueryAllClick (View v) {
List<GoodsModel> dataSource = mDBManager.queryGoods();
notifyAdapter(dataSource);
}
/**
* 筛选-水果
* @param v
*/
public void onQueryFruitsClick (View v) {
notifyAdapter(mDBManager.queryFruits());
}
/**
* 筛选-零食
* @param v
*/
public void onQuerySnacksClick (View v) {
notifyAdapter(mDBManager.querySnacks());
}
/**
* 改变展示数据
*/
private void notifyAdapter (List<GoodsModel> dataSource) {
mAdapter.setDataSource(dataSource);
}
2.更新和删除
// 保存编辑点击事件
public void onEditClick(View v) {
String info = mEtInfo.getText().toString();
mGoodsModel.setInfo(info);
mDbManager.updateGoodsInfo(mGoodsModel);
onBackPressed();
}
//删除商品
public void onDelClick(View v) {
String info = mEtInfo.getText().toString();
mGoodsModel.setInfo(info);
mDbManager.deleteGoodsInfo(mGoodsModel);
onBackPressed();
}
八:代码
1.MainActivity.java
package com.hanjie.greendao_2021_0423;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.hanjie.greendao_2021_0423