GreenDao基本使用
文章目的
今天,因为开发项目中需要使用的数据库,网上搜索Android中数据库框架的对比资料(自己斟酌,大概看看优缺点),最后决定使用greenDao,所以作此记录。
添加插件
在项目的build.gradle文件中添加greenDao插件:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
配置数据库信息,引入依赖
1、在app的build.gradle文件中应用greenDao插件
apply plugin: 'org.greenrobot.greendao' // 应用greenDao插件
2、配置数据库相关信息
greendao {
schemaVersion 1 // 数据库版本号
daoPackage 'com.example.appName.db' // 设置DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java' // 设置DaoMaster、DaoSession、Dao目录
}
3、引入greenDao依赖
implementation 'org.greenrobot:greendao:3.2.2'
编写实体类
编写实体类就相当于建表了
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Index;
import org.greenrobot.greendao.annotation.Generated;
/**
* 匹配度表
*/
@Entity
public class Match {
@Id(autoincrement = true)
private Long orderId; // Currently, entities must have a long or Long property as their primary key. This is recommended practice for Android and SQLite.
@Index(unique = true)
private String key; // 订单编号作为唯一索引
private double matchRate; // 匹配度
@Generated(hash = 1200748356)
public Match(Long orderId, String key, double matchRate) {
this.orderId = orderId;
this.key = key;
this.matchRate = matchRate;
}
@Generated(hash = 1834681287)
public Match() {
}
public Long getOrderId() {
return this.orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public String getKey() {
return this.key;
}
public void setKey(String key) {
this.key = key;
}
public double getMatchRate() {
return this.matchRate;
}
public void setMatchRate(double matchRate) {
this.matchRate = matchRate;
}
}
写好实体类后点击Android studio的锤子,build一下项目就会在你刚刚在app的build.gradle文件中配置的目录信息中生成db文件夹和Dao文件
有坑提示:greenDao支持的主键的类型为long/Long,如果需要其他类型的主键,只能再用@Index注解再见一个索引,如:
@Index(unique = true)
private String key; // 订单编号作为唯一索引
编写DbManager和Dao操作类
DbManager 用于创建数据库,获取 DaoSession 和 DaoMaster
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.xunjie.honorclient.db.DaoMaster;
import com.xunjie.honorclient.db.DaoSession;
public class DbManager {
// 是否加密
public static final boolean ENCRYPTED = true;
private static final String DB_NAME = "hc.db";
private static DbManager mDbManager;
private static DaoMaster.DevOpenHelper mDevOpenHelper;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private Context mContext;
private DbManager(Context context) {
this.mContext = context;
// 初始化数据库信息
mDevOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
getDaoMaster(context);
getDaoSession(context);
}
public static DbManager getInstance(Context context) {
if (null == mDbManager) {
synchronized (DbManager.class) {
if (null == mDbManager) {
mDbManager = new DbManager(context);
}
}
}
return mDbManager;
}
/**
* 获取可读数据库
* @param context
* @return
*/
public static SQLiteDatabase getReadableDatabase(Context context) {
if (null == mDevOpenHelper) {
getInstance(context);
}
return mDevOpenHelper.getReadableDatabase();
}
/**
* 获取DaoMaster
* 判断是否存在数据库,如果没有则创建数据库
* @param context
* @return
*/
public static DaoMaster getDaoMaster(Context context) {
if (null == mDaoMaster) {
synchronized (DbManager.class) {
if (null == mDaoMaster) {
MyOpenHelper helper = new MyOpenHelper(context, DB_NAME, null);
mDaoMaster = new DaoMaster(helper.getWritableDatabase());
}
}
}
return mDaoMaster;
}
/**
* 获取DaoSession
* @param context
* @return
*/
public static DaoSession getDaoSession(Context context) {
if (null == mDaoSession) {
synchronized (DbManager.class) {
mDaoSession = getDaoMaster(context).newSession();
}
}
return mDaoSession;
}
}
Dao操作文件就是对具体表的操作的封装类
import android.content.Context;
import com.xunjie.honorclient.db.MatchDao;
import com.xunjie.honorclient.entity.Match;
import com.zaaach.citypicker.db.DBManager;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
/**
* Match表操作类
*/
public class MatchDaoOpe {
/**
* 插入一条数据
* @param context
* @param match
*/
public static void insertData(Context context, Match match) {
DbManager.getDaoSession(context).getMatchDao().insert(match);
}
/**
* 将数据实体通过事务添加至数据库
* @param context
* @param list
*/
public static void insertData(Context context, List<Match> list) {
if (null == list || list.size() <= 0) {
return;
}
DbManager.getDaoSession(context).getMatchDao().insertInTx(list);
}
/**
* 将数据添加至数据库,判断主键,如果主键存在则只需update,否则只需insert
* @param context
* @parma match
*/
public static void saveData(Context context, Match match) {
Match oldMatch = queryByKey(context, match.getKey());
if (oldMatch != null) {
if (oldMatch.getMatchRate() != match.getMatchRate()) {
oldMatch.setMatchRate(match.getMatchRate());
updateData(context, oldMatch);
}
} else {
DbManager.getDaoSession(context).getMatchDao().save(match);
}
}
/**
* 删除数据
* @param context
* @param match 删除具体内容
*/
public static void delData(Context context, Match match) {
DbManager.getDaoSession(context).getMatchDao().delete(match);
}
/**
* 根据主键删除数据
* @param context
* @param id
*/
public static void delByKey(Context context, Long id) {
DbManager.getDaoSession(context).getMatchDao().deleteByKey(id);
}
/**
* 删除全部数据
* @param context
*/
public static void delAll(Context context) {
DbManager.getDaoSession(context).getMatchDao().deleteAll();
}
/**
* 更新数据
* @param context
* @param match
*/
public static void updateData(Context context, Match match) {
DbManager.getDaoSession(context).getMatchDao().update(match);
}
/**
* 根据索引查询数据
* @param context
* @param key
* @return
*/
public static Match queryByKey(Context context, String key) {
QueryBuilder<Match> builder = DbManager.getDaoSession(context).getMatchDao().queryBuilder();
return builder.where(MatchDao.Properties.Key.eq(key)).unique();
}
/**
* 查询所有数据
* @parma context
* @return
*/
public static List<Match> queryAll(Context context) {
QueryBuilder<Match> builder = DbManager.getDaoSession(context).getMatchDao().queryBuilder();
return builder.build().list();
}
/**
* 分页加载
* @param context
* @param pageSize 当前第几页
* @param pageNum 每页显示数量
*/
public static List<Match> queryPaging(int pageSize, int pageNum, Context context) {
MatchDao matchDao = DbManager.getDaoSession(context).getMatchDao();
List<Match> list = matchDao.queryBuilder()
.offset(pageSize * pageNum).limit(pageNum).list();
return list;
}
}
数据库升级的相关内容
这一块内容直接给出我写这篇文章时查找学习的文章链接,写的很详细。
链接: GreenDao3.2使用详解(增,删,改,查,升级).
真机调试查看数据库
如果想要真机调试时方便查看数据库,可以使用SQLiteStudio这个工具。
下载链接:SQLiteStudio
使用方法可以参考这篇文章:
SQLiteStudio优雅调试Android手机数据库Sqlite