关于GreenDao的配置:http://itangqi.me/2015/07/26/orm-greendao-summary/
在上述配置中的第三步,生成DAO文件时,步骤如下:主菜单->Run -> Run…
然后就会弹出
选择ExampleDaoGenerator运行就ok了。
注意:可以用“RE文件管理器“来查看数据库,测试是否创建成功。
GreenDao 的基本使用方法
1、如何创建表
在daoexamplegenerator工程下的ExampleDaoGenerator.java文件中添加表,如下:
public class ExampleDaoGenerator {
public static void main(String[] args) throws Exception{
//在更新的时候要更改版本号
Schema schema = new Schema(1,"com.example.baiyuanwei.commonlib");
//添加一个noto表
addNote(schema);
//添加一个book表
addBook(schema);
//添加一个学生表
addStudent(schema);
//这行代码就可以自动生成我们需要的代码了
new DaoGenerator().generateAll(schema,"/Users/baiyuanwei/Documents/androidFiles/CommonLib/app/src/main/java-gen");
}
/**
* 这是一个note表
* @param schema
*/
private static void addNote(Schema schema){
Entity note = schema.addEntity("Note");
//默认id 是主键
note.addIdProperty();
note.addStringProperty("text").notNull();
note.addDateProperty("date");
note.addStringProperty("comment");
}
/**
* 书表
* @param schema
*/
private static void addBook(Schema schema){
Entity book = schema.addEntity("BookLib");
book.addIdProperty();
book.addStringProperty("name");
book.addIntProperty("price");
}
/**
* 这是一个新建的表
* @param schema
*/
private static void addStudent(Schema schema){
Entity entity = schema.addEntity("Student");
entity.addIdProperty();
entity.addStringProperty("name");
}
}
注意:我们在测试的时候,如果修改了此文件,就要重新编译一次此文件,生成DAO文件,最好把测试手机上的此app删掉,重新编译安装,否则就得更改版本号更新。
2、如何使用生成的DAO 文件
我们自定义Application,如下:
public class MyApplication extends Application {
private DaoMaster daoMaster;
private DaoSession daoSession;
private SQLiteDatabase sqLiteDatabase;
@Override
public void onCreate() {
super.onCreate();
setupDataBase();
}
private void setupDataBase() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, DbConstant.DB_NAME, null);
sqLiteDatabase = helper.getWritableDatabase();
daoMaster = new DaoMaster(sqLiteDatabase);
daoSession = daoMaster.newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
}
我们只要用DaoSession这个对象就可以完成数据库的增删改查了。其中主要的就是DaoMaster、DaoSession、SQLiteDatabase,这些在Application中创建好,我们就相当于在整个app中创建了一次这些变量。
然后我们新建一个DbHelper.java类,完成对数据库增删改查的封装,如下:
public class DbHelper {
//note表
private NoteDao noteDao;
//BookLib 表
private BookLibDao bookLibDao;
private static DbHelper dbHelperInstance;
private static Context mContext;
/**
* 单例模式得到DbHelper的对象
*
* @param context
* @return
*/
public static DbHelper getDbHelperInstance(Context context) {
if (dbHelperInstance == null) {
dbHelperInstance = new DbHelper();
if (mContext == null) {
mContext = context;
}
DaoSession daoSession = ((MyApplication) mContext.getApplicationContext()).getDaoSession();
dbHelperInstance.noteDao = daoSession.getNoteDao();
dbHelperInstance.bookLibDao = daoSession.getBookLibDao();
}
return dbHelperInstance;
}
/**
* 如果不存在该书名,就增加数据
* @param bookLib
*/
public void insertBookLibData(BookLib bookLib) {
if (!isSaveByName(bookLib.getName())){
bookLibDao.insert(bookLib);
}
}
/**
* 根据id删除数据
* 也可以根据其它列删除数据
*
* @param id
*/
public void deleteBook(int id) {
QueryBuilder<BookLib> qb = bookLibDao.queryBuilder();
//where的括号中就是条件,把其中的"Id"换成其它列名就ok了,"eq"代表相等
DeleteQuery<BookLib> dq = qb.where(BookLibDao.Properties.Id.eq(id)).buildDelete();
dq.executeDeleteWithoutDetachingEntities();
}
/**
* 删除BookLib表中的所有数据
*/
public void deleteAll() {
bookLibDao.deleteAll();
}
/**
* 修改数据
* 要知道该条目的主键的值
* @param bookLib
*/
public void updateBook(BookLib bookLib) {
bookLibDao.update(bookLib);
}
/**
* 查询booklib表中的所有数据
*
* @return
*/
public List<BookLib> queryAllBookLib() {
return bookLibDao.loadAll();
}
/**
* 查询
* 根据name这一列,查询是否已经存在此name
* 也可以根据其它列来查询,只要修改where中的代码就ok了
* @param name
* @return
*/
public boolean isSaveByName(String name) {
QueryBuilder<BookLib> qb = bookLibDao.queryBuilder();
qb.where(BookLibDao.Properties.Name.eq(name));
int count = (int) qb.buildCount().count();
return count > 0 ? true : false;
}
/**
* 查询
* 根据书的名字返回书的价格
* @param name
* @return -1代表没有此书
*/
public int getPriceByName(String name){
QueryBuilder<BookLib> qb = bookLibDao.queryBuilder();
qb.where(BookLibDao.Properties.Name.eq(name));
if (qb.list().size()>0){
//返回书的价格
return qb.list().get(0).getPrice();
}else {
//没有此书,返回一个错误码
return -1;
}
}
/**
* 查询
* 根据多个条件来查询
* @param name
* @param price
* @return 返回符合条件的所有booklib
*/
public List<BookLib> getMoreQuery(String name,int price){
QueryBuilder<BookLib> qb = bookLibDao.queryBuilder();
qb.where(BookLibDao.Properties.Name.eq(name),BookLibDao.Properties.Price.eq(price));
return qb.list();
}
}
增删改查中,这里只看一下“改“,其它的可以看下代码就应该懂了。在“改“的时候,需要注意:
public void updateBook(BookLib bookLib) {
bookLibDao.update(bookLib);
}
在bookLib这个变量中,每个属性的值都要有,只是修改需要改的属性,其中主键的值肯定是不能变的,在GreenDao中默认主键是id(暂时不知道怎么设置主键)。