最近想学习一下使用GreenDao进行数据库操作,但是在网上查到的教程都是比较久的,而且在Android Studio平台上面使用的方式也有些不同.学习了些皮毛,写一篇博客记录一下,也给刚入门的同行们分享一下经验.
ps:
第一篇博客,欢迎指正/批评.
转载请注明出处:
http://blog.csdn.net/risky78125/article/details/48738683
http://greendao-orm.com/
略
compile ‘de.greenrobot:greendao-generator:2.0.0’
package com.lanou3g.greenrobot;
import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;
public class ExpDaoGenerator {
public static void main(String[] args) {
// 创建Schema对象
// 构造方法第一个参数为数据库版本号
// 第二个参数为自动生成的实体类将要存放的位置,前面为我的Android Module的包名
Schema schema = new Schema(1000, "com.lanou3g.greendaodemo.entity.greendao");
// 添加需要创建的实体类信息
addNote(schema);
try {
// 创建实体类.第二个参数填Android Module的路径
new DaoGenerator().generateAll(schema, "./AppExample/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 添加将要创建的实体类的信息,会根据类名生成数据库的表,属性名生成数据库的字段
* 当然如果想建多张表,可以创建多个Entity对象
*
* @param schema
*/
private static void addNote(Schema schema) {
// 指定需要生成实体类的类名,类名确定了那么表名也是根据这个类名来自动命名的,例如下面这个,生成的表名叫做person_entity
Entity entity = schema.addEntity("PersonEntity");
// 指定自增长主键
entity.addIdProperty().autoincrement().primaryKey();
// 添加类的属性,根据属性生成数据库表中的字段
entity.addStringProperty("name");
entity.addIntProperty("age");
entity.addStringProperty("sex");
}
}
5.打开Android Module,默认名字叫app,我这里改成了AppExample,打开这里面的build.gradle文件,添加依赖如下:
compile ‘de.greenrobot:greendao:2.0.0’
public class MainActivity extends AppCompatActivity {
/** 省略一些控件的声明 */
// 数据库
private SQLiteDatabase db;
// 管理者
private DaoMaster mDaoMaster;
// 会话
private DaoSession mDaoSession;
// 对应的表,由java代码生成的,对数据库内相应的表操作使用此对象
private PersonEntityDao personDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatabase();
}
private void initDatabase() {
// 初始化就这个顺序,记着吧 ^_^
// 此DevOpenHelper类继承自SQLiteOpenHelper,第一个参数Context,第二个参数数据库名字,第三个参数CursorFactory
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"daodemo.db",null);
db = helper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
PersonEntityDao personDao = mDaoSession.getPersonEntityDao();
// 删除表内所有数据(我为什么要写这个方法...太简单了吧也),写入前先清空一下,防止id冲突导致报错
personDao.deleteAll();
// 下面对数据库内的表进行操作
// 首先模拟一些数据
List personList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
PersonEntity person = new PersonEntity((long) i,"孙悟空"+i,20+i,"男");
// 使用这个方法可以一条一条的写入数据库
personDao.insert(person);
// 插入或者替换单条数据,就是id重复也可以使用
// personDao.insertOrReplace(person);
personList.add(person);
}
// 这个方法可以将一个集合直接写入数据库,很方便
// personDao.insertInTx(personList);
// 看名字也知道是干嘛的了吧,把数据写入,或者替换
// personDao.insertOrReplaceInTx(personList);
// 根据id删除数据 - -! 我真的一定要写出来么
personDao.deleteByKey(3l);
// 更新表内元素
personDao.update(new PersonEntity(5l,"贝吉塔",100,"男"));
// 查表,结果直接返回到链表中,下面的三种方法都可以进行查表操作,将所有信息都查出来
List queryList = personDao.queryBuilder().list();
// queryList = personDao.queryBuilder().listLazy();
// queryList = personDao.loadAll();
// 输出结果,看一下
for (PersonEntity personEntity : queryList) {
Log.d("TAGGG",personEntity.getName());
}
}
private void initView() {
/** 初始化控件的,没什么用,省略了 */
}
}
下面看一下数据库内的内容:
可以看到id为3的那一条数据被删除掉了,id为5的那一条数据被修改了;
7.很多界面都这么写数据库肯定会很麻烦嘛,所以需要使用单例.我就简单写一个了,见笑啦,代码如下
public class DaoSingleton {
private static final String DATABASE_NAME = "daodemo.db";
private volatile static DaoSingleton instance;
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
private Context context;
private DaoMaster.DevOpenHelper helper;
private PersonEntityDao personDao;
private DaoSingleton() {
context = BaseApplication.getContext();
}
public static DaoSingleton getInstance() {
if (instance == null) {
synchronized (DaoSingleton.class){
if (instance == null) {
instance = new DaoSingleton();
}
}
}
return instance;
}
public DaoMaster.DevOpenHelper getHelper() {
if (helper == null) {
helper = new DaoMaster.DevOpenHelper(context,DATABASE_NAME,null);
}
return helper;
}
private SQLiteDatabase getDb(){
if (db == null) {
db = getHelper().getWritableDatabase();
}
return db;
}
private DaoMaster getDaoMaster() {
if (daoMaster == null) {
daoMaster = new DaoMaster(getDb());
}
return daoMaster;
}
public DaoSession getDaoSession() {
if (daoSession == null) {
daoSession = getDaoMaster().newSession();
}
return daoSession;
}
public PersonEntityDao getPersonDao() {
if (personDao == null) {
personDao = getDaoSession().getPersonEntityDao();
}
return personDao;
}
}
里面用到的Context使用的是Application的,防止单例类长时间持有其他Activity的Context,影响性能;使用的话,直接在代码中调用
PersonEntityDao personDao = DaoSingleton.getInstance().getPersonDao();
来获取对象;
好了,结束,欢迎批评指正,谢谢!