本文介绍了greendao的基础入门使用:其中包括数据库的增删改查,基本使用功能,简单方便,易懂。
优势:
1:性能最大化
2:内存开销最小
3:API 简单好用
4:对Android 高度优化
5:2.2版本以上还支持加密数据库
6:支持protobuf协议存储(protobuf 比json更快,google的优秀产品,因此greendao能很好地与retrofit 2.0结合protobuf网络请求并缓存)
先看效果
步骤一、在自己的build.gradle中加入这些配置
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
}
apply plugin: 'org.greenrobot.greendao'
greendao {
//数据库的schema版本,也可以理解为数据库版本号
schemaVersion 1
//设置DaoMaster、DaoSession、Dao包名,也就是要放置这些类的包的全路径。
daoPackage 'cn.hnshangyu.testgreendao.greendao'
//设置DaoMaster、DaoSession、Dao目录
targetGenDir 'src/main/java'
}
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
针对于daoPackage 我的项目内容如下
步骤二、创建Student实体类
package cn.hnshangyu.testgreendao.bean;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Keep;
@Entity(generateConstructors = false)
public class Student {
@Id
private Long id;
private String name;
private int age;
public Student() {
}
@Keep
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Keep
public Long getId() {
return id;
}
@Keep
public void setId(Long id) {
this.id = id;
}
@Keep
public String getName() {
return name;
}
@Keep
public void setName(String name) {
this.name = name;
}
@Keep
public int getAge() {
return age;
}
@Keep
public void setAge(int age) {
this.age = age;
}
@Keep
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return name.equals(student.name);
}
@Keep
@Override
public int hashCode() {
return (int) (id ^ (id >>> 32));
}
@Keep
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
步骤三、修复一下工程,自动生成greendao包下的类(就是点击一下小锤子),你会自动生成上图中greendao包中的类。
步骤四、开始使用,创建管理类
package cn.hnshangyu.testgreendao.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import cn.hnshangyu.testgreendao.greendao.DaoMaster;
import cn.hnshangyu.testgreendao.greendao.DaoSession;
public class DbManager {
// 是否加密
public static final boolean ENCRYPTED = true;
private static final String DB_NAME = "test.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();
}
/**
* 获取可写数据库
*
* @param context
* @return
*/
public static SQLiteDatabase getWritableDatabase(Context context) {
if (null == mDevOpenHelper) {
getInstance(context);
}
return mDevOpenHelper.getWritableDatabase();
}
/**
* 获取DaoMaster
*
* @param context
* @return
*/
public static DaoMaster getDaoMaster(Context context) {
if (null == mDaoMaster) {
synchronized (DbManager.class) {
if (null == mDaoMaster) {
mDaoMaster = new DaoMaster(getWritableDatabase(context));
}
}
}
return mDaoMaster;
}
/**
* 获取DaoSession
*
* @param context
* @return
*/
public static DaoSession getDaoSession(Context context) {
if (null == mDaoSession) {
synchronized (DbManager.class) {
mDaoSession = getDaoMaster(context).newSession();
}
}
return mDaoSession;
}
}
步骤五、增删改查,
package cn.hnshangyu.testgreendao.db;
import android.content.Context;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
import cn.hnshangyu.testgreendao.bean.Student;
public class StudentDaoOpe {
/**
* 添加数据至数据库
*
* @param context
* @param stu
*/
public static void insertData(Context context, Student stu) {
DbManager.getDaoSession(context).getStudentDao().insert(stu);
}
/**
* 将数据实体通过事务添加至数据库
*
* @param context
* @param list
*/
public static void insertData(Context context, List list) {
if (null == list || list.size() <= 0) {
return;
}
DbManager.getDaoSession(context).getStudentDao().insertInTx(list);
}
/**
* 添加数据至数据库,如果存在,将原来的数据覆盖
* 内部代码判断了如果存在就update(entity);不存在就insert(entity);
*
* @param context
* @param student
*/
public static void saveData(Context context, Student student) {
DbManager.getDaoSession(context).getStudentDao().save(student);
}
/**
* 删除数据至数据库
*
* @param context
* @param student 删除具体内容
*/
public static void deleteData(Context context, Student student) {
DbManager.getDaoSession(context).getStudentDao().delete(student);
}
/**
* 根据id删除数据至数据库
*
* @param context
* @param id 删除具体内容
*/
public static void deleteByKeyData(Context context, long id) {
DbManager.getDaoSession(context).getStudentDao().deleteByKey(id);
}
/**
* 删除全部数据
*
* @param context
*/
public static void deleteAllData(Context context) {
DbManager.getDaoSession(context).getStudentDao().deleteAll();
}
/**
* 更新数据库
*
* @param context
* @param student
*/
public static void updateData(Context context, Student student) {
DbManager.getDaoSession(context).getStudentDao().update(student);
}
/**
* 查询所有数据
*
* @param context
* @return
*/
public static List queryAll(Context context) {
QueryBuilder builder = DbManager.getDaoSession(context).getStudentDao().queryBuilder();
return builder.build().list();
}
/**
* 根据id,其他的字段类似
*
* @param context
* @param id
* @return
*/
public static List queryForId(Context context, long id) {
QueryBuilder builder = DbManager.getDaoSession(context).getStudentDao().queryBuilder();
/**
* 返回当前id的数据集合,当然where(这里面可以有多组,做为条件);
* 这里build.list();与where(StudentDao.Properties.Id.eq(id)).list()结果是一样的;
* 在QueryBuilder类中list()方法return build().list();
*
*/
// Query build = builder.where(StudentDao.Properties.Id.eq(id)).build();
// List list = build.list();
return builder.where(StudentDao.Properties.Id.eq(id)).list();
}
}
步骤六、mainactivity布局
步骤七、mainActivity
package cn.hnshangyu.testgreendao;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import cn.hnshangyu.testgreendao.bean.Student;
import cn.hnshangyu.testgreendao.db.StudentDaoOpe;
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.add)
Button add;
@InjectView(R.id.delete)
Button delete;
@InjectView(R.id.updata)
Button updata;
@InjectView(R.id.check)
Button check;
@InjectView(R.id.deleteAll)
Button deleteAll;
@InjectView(R.id.check_id)
Button checkId;
private Context mContext;
private Student student;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
mContext = this;
initData();
initListener();
}
private List studentList = new ArrayList<>();
/**
* 初始化数据
*/
private void initData() {
for (int i = 0; i < 100; i++) {
student = new Student((long) i, "huang" + i, 25);
studentList.add(student);
}
}
private void initListener() {
/**
*增
*/
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StudentDaoOpe.insertData(mContext, studentList);
}
});
/**
* 删
*/
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Student student = new Student((long) 5, "haung" + 5, 25);
/**
* 根据特定的对象删除
*/
StudentDaoOpe.deleteData(mContext, student);
/**
* 根据主键删除
*/
StudentDaoOpe.deleteByKeyData(mContext, 7);
}
});
/**
*删除所有
*/
deleteAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StudentDaoOpe.deleteAllData(mContext);
}
});
/**
* 更新
*/
updata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Student student = new Student((long) 2, "haungxiaoguo", 16516);
StudentDaoOpe.updateData(mContext, student);
}
});
/**
* 查询全部
*/
check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List students = StudentDaoOpe.queryAll(mContext);
for (int i = 0; i < students.size(); i++) {
Log.i("Log", students.get(i).getName());
}
}
});
/**
* 根据id查询
*/
checkId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List students = StudentDaoOpe.queryForId(mContext, 50);
for (int i = 0; i < students.size(); i++) {
Log.i("Log", students.get(i).getName());
}
}
});
}
}
下面就是效果了
点击“增”->“查”出现
点击“删”->“查”出现
huang5与huang7被删除了
点击“改”->“查”出现
huang2被修改成huangxiaoguo了
点击“根据ID查”
查询结果只有huang50
greendao中的注解
(一) @Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(二) @Id
(三) @NotNull 不为null
(四) @Unique 唯一约束
(五) @ToMany 一对多
(六) @OrderBy 排序
(七) @ToOne 一对一
(八) @Transient 不存储在数据库中
(九) @generated 由greendao产生的构造函数或方法
这样以后用着就方便了,哈哈哈~~~
关于数据库的更新请看下一篇:greendao3.0以上使用步骤(二):数据库到底该怎么升级
Greendao的模糊查询需要对传人的值前后加”%”,如:”%”+value+”%”;
Greendao模糊查询like方法的使用:like(“%你想匹配的%”);
1、例如:
QueryBuilder qb = words_Dao.queryBuilder();
qb.where(Properties.Shops_id.like("%"+"你需要搜的"+"%"));
2、分页加载:
/**
* 查询所有数据
* 分页加载
* @param context
* @param pageSize 当前第几页
* @param pageNum 每页显示多少个
* @return
*/
public static List queryAll(Context context, int pageSize, int pageNum) {
QueryBuilder builder = DbManager.getDaoSession(context, DB_NAME).getBaseRecordStationDao().queryBuilder();
List list = builder
.offset(pageSize - 1)//从0开始的
.limit(pageNum)
.orderDesc(BaseRecordStationDao.Properties.Id)
.build()
.list();
return list;
}