在开发过程中,如果用常规的原生创建数据库的方式来操作的话,可能会遇到数据库开启关闭的异常,或者是线程里面同事处理一张表也会报出各种异常,在大趋势下我们主流的数据库框架有orm和greendao,现在greendao3.0也是采用的orm框架整合的,所以我们一起来看看怎么用GreenDao操作数据库.
首先我们来简单的实现新建一张表,然后插入数据,查看数据.这里我把每次点击的时间存入数据库,然后查询出来.如下效果图:
一:创建实体和表
这里我们用到一个工具工程,里面包含两个jar方便在生成代码中使用,如图:
在ExampleDaoGenerator中,我们需要指定自己生成的目录,这里
// 加载本地配置文件中保存的路径
String savePath ="D:\\db";
//然后自己填写需要创建的字段
private static voidaddTaskViewLoadDocTable(Schema schema)
{
Entity entity = schema.addEntity("TaskViewEntity");
entity.setJavaPackage("com.test.entity.task");
entity.setJavaPackageDao("com.test.db.greendao.dao.task");
entity.setJavaDoc("任务视图");
entity.implementsSerializable();
entity.addStringProperty("guid").primaryKey().javaDocField("主键ID");
entity.addStringProperty("taskId").javaDocField("任务ID");
entity.addStringProperty("workDocId").javaDocField("产出文档ID");
entity.addStringProperty("docSubject").javaDocField("产出文档标题");
entity.addStringProperty("fileId").javaDocField("关联文档表的docId");
entity.addStringProperty("createUser").javaDocField("创建用户");
entity.addStringProperty("createDate").javaDocField("创建时间");
entity.addStringProperty("updateDate").javaDocField("更新时间");
}
然后右键运行后我们可以在指定的目录看到生成的文件,如图:
二:在imp中添加方法(查询,增加)
在成功生成文件后,我们需要将TaskViewEntityDao和TaskViewEntity移到自己的开发工程中去,然后新建一个lmp的类,处理我们所需要对表操作的逻辑.这里开发工程中大致需要用到如下这些操作数据库的工具类,如图:
先看Impl中的逻辑,插入操作:
/**
* 修改
*
*@param
*/
public voidsetTaskViewEntityDisplayed(TaskViewEntity taskViewEntity)
{
taskViewEntity.setUpdateDate(DateUtil.shortDate());
DbUtils.getsTaskViewEntityDaoImpl().insertOrUpdate(taskViewEntity);
}
查询操作:
/**
* 查询列表所有
*
*@return
*/
publicList getTaskViewListByDisplayable()
{
QueryBuilder queryBuilder = queryBuilder();
returnqueryBuilder.orderDesc(TaskViewEntityDao.Properties.UpdateDate).build().list();
}
三:整合工具类,初始化GreenDao
//初始化:
@Override
public voidonCreate()
{
super.onCreate();
// GreenDao初始化
GreenDao.init(getApplicationContext());
GreenDao.getDaoSession();
}
四:调用方法.
btn_do.setOnClickListener(newView.OnClickListener()
{
@Override
public voidonClick(View view)
{
TaskViewEntity taskViewEntity =newTaskViewEntity();
taskViewEntity.setGuid(DateUtil.curTime());
DbUtils.getsTaskViewEntityDaoImpl().insertOrUpdate(taskViewEntity);
List taskViewEntities = DbUtils.getsTaskViewEntityDaoImpl().getTaskViewListByDisplayable();
StringBuffer sb =newStringBuffer();
for(inti =0; i < taskViewEntities.size(); i++)
{
sb.append(taskViewEntities.get(i).getGuid()).append("\n");
}
Toast.makeText(MainActivity.this, sb.toString(),1).show();
}
});
}
另外在截取一些关键代码:
//创建表
public static voidcreateAllTables(SQLiteDatabase db,booleanifNotExists)
{
TaskViewEntityDao.createTable(db, ifNotExists);
}
//删除表
public static voiddropAllTables(SQLiteDatabase db,booleanifExists)
{
TaskViewEntityDao.dropTable(db, ifExists);
}
//更新表
public voidonUpgrade(SQLiteDatabase db,intoldVersion,intnewVersion)
{
Log.i("greenDAO","Upgrading schema from version "+ oldVersion +" to "+ newVersion +
" by dropping all tables");
dropAllTables(db,true);
onCreate(db);
}
附件:(后续github上传)
(1)自动生成表结构工程代码(已经github上传)
(2)主工程代码.