最近在写数据库的框架,用的是SQLite原生语言进行封装的,感觉非常的繁琐,效率也低,所以就来参考下GreenDao的做法,学习一下他的用法,给他简单封装,
便于后续的使用。
GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。 SQLite是一个令人敬畏的内嵌的关系数据库,编写SQL和解析查询结果是相当乏味和耗时的任务。通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),GreenDAO可以将它们从这些映射中释放出来,这样,您可以使用简单的面向对象的API来存储,更新,删除和查询数据库。
简单的讲,GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
简单的讲,就是JavaBean和我们的数据库进行一个关系映射,一个实例对象对应数据库的一条记录,每个对象的属性则对应着数据库表的字段。
buildscript {
repositories {
jcenter()
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply plugin: 'org.greenrobot.greendao'
greendao {
schemaVersion 1 //版本
daoPackage '包名.生成的文件夹名' // 一般为app包名+生成文件的文件夹名,例com.example.greendao.dao
targetGenDir 'src/main/java' //生成文件路径
}
//greendao
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'org.greenrobot:greendao-generator:3.2.2'
@Entity
public class DBbean {
@Id
private Long id;
@Property(nameInDb = "date")
private String date;
@Generated(hash = 738726528)
public DBbean(Long id, String date) {
this.id = id;
this.date = date;
}
@Generated(hash = 758483710)
public DBbean() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getDate() {
return this.date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "id="+id+" date="+date;
}
}
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property(nameInDb = “”)表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
我们点击make project后greenDao的插件会在我们刚才配置的路径下自动生成三个类文件:DBbeanDao,DaoMaster,DaoSession,以后数据库操作都会用到这三个类。
网上也有很多类似的GreenDao的管理,用于数据库的增删改查,我这里简单做个封装,增强它的扩展性。
package com.lcp.library.db;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.query.LazyList;
import org.greenrobot.greendao.query.WhereCondition;
import java.util.List;
/**
* Created by lcp on 2018/6/17.
*/
public class GreendaoManager<T,D extends AbstractDao<T,Long>> {
private D dao;
public GreendaoManager(D dao) {
this.dao = dao;
}
/**
* 增或者替换(有的话就替换,没有则增)
*/
public void insertOrReplace(T bean) {
dao.insertOrReplace(bean);
}
/**
* 删
*
* @param i 删除数据的id
*/
public void delete(long i) {
dao.deleteByKey(i);
//当然Greendao还提供了其他的删除方法,只是传值不同而已
}
/**
* 删除所有
*/
public void deleteAll() {
dao.deleteAll();
}
/**
* 改
*
* @param
*/
public void correct(T bean) {
dao.update(bean);
}
/**
* 查找符合某一条件的所有元素
*/
public List searchEveryWhere(WhereCondition condition) {
LazyList DBbeans = dao.queryBuilder().where(condition).listLazy();
return DBbeans;
}
/**
* 查询所有数据
*
* @param
* @return
*/
public List queryAll() {
//惰性
LazyList DBbeans = dao.queryBuilder().listLazy();
return DBbeans;
}
}
package com.example.administrator.rxjavaretrofitmvp.app;
import android.app.Application;
import android.database.sqlite.SQLiteDatabase;
import com.example.administrator.rxjavaretrofitmvp.greendao.dao.DaoMaster;
import com.example.administrator.rxjavaretrofitmvp.greendao.dao.DaoSession;
/**
* Created by lcp on 2018/6/17.
*/
public class MyApplication extends Application {
public static MyApplication instance=null;
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
@Override
public void onCreate() {
super.onCreate();
instance=this;
setDataBase();
}
public static MyApplication getInstances(){
return instance;
}
private void setDataBase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "lcp-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
package com.lcp.lcplib.ui;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.lcp.lcplib.Entity.DBbean;
import com.lcp.lcplib.R;
import com.lcp.lcplib.app.MyApplication;
import com.lcp.lcplib.greendao.dao.DBbeanDao;
import com.lcp.lcplibrary.mvp.db.GreendaoManager;
import org.greenrobot.greendao.query.WhereCondition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class DbActivity extends Activity {
private Long id=0L;
private TextView txt;
private GreendaoManager greendaoManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db);
txt = findViewById(R.id.txt);
//得到Dao对象
DBbeanDao dBbeanDao = MyApplication.getInstances().getDaoSession().getDBbeanDao();
//得到该Dao对象的管理器(如果你本地就一张表,GreendaoManager可以写成单例,通过构造方法传参,如果多张表不建议写成单例)
greendaoManager = new GreendaoManager<>(dBbeanDao);
//增
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
id++;
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strdate = format.format(date);
DBbean dBbean = new DBbean(id, strdate);
DbActivity.this.greendaoManager.insertOrReplace(dBbean);
}
});
//删
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DbActivity.this.greendaoManager.delete(id);
id--;
}
});
//改
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strdate = format.format(date);
DBbean dBbean = new DBbean(id, strdate);
DbActivity.this.greendaoManager.correct(dBbean);
}
});
//查询所有
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List dBbeans = DbActivity.this.greendaoManager.queryAll();
StringBuffer stringBuffer=new StringBuffer();
for (int i=0;i
{
DBbean dBbean = (DBbean) dBbeans.get(i);
String s = dBbean.toString();
stringBuffer.append(s+"\n");
}
txt.setText(stringBuffer.toString());
}
});
//删除所有
findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DbActivity.this.greendaoManager.deleteAll();
}
});
//查询包含某一数据的记录
findViewById(R.id.button6).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
WhereCondition condition = DBbeanDao.Properties.Id.eq(id);
List dBbeans = DbActivity.this.greendaoManager.searchEveryWhere(condition);
StringBuffer stringBuffer=new StringBuffer();
for (int i=0;i
{
DBbean dBbean = dBbeans.get(i);
String s = dBbean.toString();
stringBuffer.append(s+"\n");
}
txt.setText(stringBuffer.toString());
}
});
}
}
以上就是我对GreenDao的简单封装,当你本地有多张表的时候使用起来就非常方便了,扩展性很强,有知道还可以在优化的小伙伴欢迎私信我~
最后附上源码