GreenDao的使用方法

GreenDao的使用方法详解

----------------------

GreenDao orm数据库框架



优势:

1:性能最大化

2:内存开销最小

3:API 简单好用

4:对android 高度优化

5:2.2版本以上还支持加密数据库

6:支持protobuf协议存储(protobuf 比json更快,google的优秀产品,因此greendao能很好地与retrofit 2.0结合protobuf网络请求并缓存)


greendao的性能远胜于ORMLite ActiveAndroid Xutils等(我亲自测试了的)

greendao是两级数据库,分为持久的内存sqlite数据库与内存数据库,如果频繁操作数据库的话,建议是用内存数据库,然后持久到sqlite中,这样的性能远胜于原生的sqlite,即使不使用内存数据库,也几乎与原生sqlite的效率几乎接近。


第一步:添加依赖并创建独立session空间

compile 'org.greenrobot:greendao-encryption:2.2.0'
compile 'net.zetetic:android-database-sqlcipher:3.4.0'



第二步骤:创建代码自动生成器 的java工程:



并添加生成依赖:

compile 'org.greenrobot:greendao-generator-encryption:2.2.0'

dao的生成器

       能自动生成模板

orm数据库的模型和表是一一对应的,也就是说通常情况下模型的字段就是表的列:

创建表需要依赖实体,但是greendao框架的生成器已经能自动创建模型

创建模型或者说创建表 需要用到Schema类:也就是实体添加的容器

Schema schema = new Schema(1"de.greenrobot.daoexample"); 可以创建一张表对应的版本与实体存放的包

接着需要创建实体:需要用到生成器中的一个Entity类,通过schema.addEntity(name) 可以实例化一个指定类名的实体类:

如:Entity entity=schema.addEntity("Note");

添加完实体,总得需要字段或者说表的列吧

添加列也就是实体的字段名称:

entity.addIdProperty();//主键

entity.addStringProperty("title");//列名

DaoGenerator可以帮我们自动生成entity-表的java代码;

完整代码:

 
  1. package com.example;  
  2.   
  3. import de.greenrobot.daogenerator.DaoGenerator;  
  4. import de.greenrobot.daogenerator.Entity;  
  5. import de.greenrobot.daogenerator.Schema;  
  6.   
  7. public class NoteDaoGenerator {  
  8.   
  9.     public static final int version=1;//数据库版本号  
  10.     public static final String entityPackageName="com.xuan.db.entity";//实体生存的包名  
  11.     public static final String entityClassName="Note";//实体的类名  
  12.     public static final String daoPackageName="com.xuan.db.dao";//指定dao层模板的包  
  13.   
  14.     //自动生成模板类存放的绝对地址,也就是你的module创建的session文件夹 也就是java-gen  
  15.     public static final String autoGenerateJavaPath="E:\\Programing\\androidstudio\\workspace\\GitOsc_StudyProject\\db_greendao\\src\\main\\java-gen";  
  16.   
  17.     public static void main(String[] args) throws Exception {  
  18.   
  19.         Schema schema = new Schema(version, entityPackageName);  
  20.         schema.setDefaultJavaPackageDao(daoPackageName);//如果不指定 默认与entityPackageName一致  
  21.         Entity entity=schema.addEntity(entityClassName);  
  22.         entity.addIdProperty();//主键  
  23.         entity.addStringProperty("title");//表的地2列 列名  
  24.         entity.addStringProperty("content");//表的地3列 列名  
  25.         entity.addStringProperty("createTime");//表的地4列 列名  
  26.         entity.setClassNameDao("NoteDao");//设置dao类的名称  
  27.         entity.setJavaDoc("auto greenDao generate javaBean by xuan");  
  28.         entity.setTableName("tb_note");//设置表名,默认是entityClassName(NOTE)的大写形式  
  29.         //自动生成java模板类  
  30.         new DaoGenerator().generateAll(schema,autoGenerateJavaPath);  
  31.     }  
  32. }  
 
执行java main方法,可以在控制台看到如下,表示创建成功,否则您需要检查你的路径是否存在 
 



可以看到在我们指定的文件夹下面已经创建好了这些模型与dao的java类


框架的sqlite语句控制台打印 控制

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xuan.greendaoencryp;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Application;  
  5. import android.os.Bundle;  
  6.   
  7. import de.greenrobot.dao.query.QueryBuilder;  
  8.   
  9. /** 
  10.  * @author xuanyouwu 
  11.  * @email xuanyouwu@163.com 
  12.  * @time 2015-12-31 10:33 
  13.  */  
  14. public class BaseApplication extends Application {  
  15.   
  16.     @Override  
  17.     public void onCreate() {  
  18.         super.onCreate();  
  19.         QueryBuilder.LOG_SQL = true;  
  20.         QueryBuilder.LOG_VALUES =true;  
  21.     }  
  22. }  


dao已经生存好了,接下来就是Orm的增删查改操作了

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xuan.greendaoencryp.presenter;  
  2.   
  3. import android.content.Context;  
  4.   
  5. import com.xuan.db.dao.DaoMaster;  
  6. import com.xuan.db.dao.DaoSession;  
  7. import com.xuan.db.entity.Note;  
  8.   
  9. import java.util.List;  
  10.   
  11. /** 
  12.  * @author xuanyouwu 
  13.  * @email xuanyouwu@163.com 
  14.  */  
  15. public class NotePresenter {  
  16.   
  17.     public static final String dbName = "mynote.db";  
  18.     DaoSession daoSession;  
  19.     DaoMaster daoMaster;  
  20.     DaoMaster.DevOpenHelper helper;  
  21.   
  22.     public NotePresenter(Context context) {  
  23.         helper = new DaoMaster.DevOpenHelper(context, dbName);//创建数据库  
  24.         daoMaster = new DaoMaster(helper.getWritableDatabase());  
  25.         daoSession = daoMaster.newSession();  
  26.     }  
  27.   
  28.   
  29.     public long add(Note note) throws Exception {  
  30.         return daoSession.insertOrReplace(note);  
  31.     }  
  32.   
  33.     public void update(Note note) throws Exception {  
  34.         daoSession.update(note);  
  35.     }  
  36.   
  37.     public List<Note> loadAll() throws Exception {  
  38.         return daoSession.getNoteDao().loadAll();  
  39.     }  
  40.   
  41.     public void delete(Note note) throws Exception {  
  42.         daoSession.delete(note);  
  43.     }  
  44.   
  45.     public void close() {  
  46.         daoSession.clear();  
  47.         daoSession = null;  
  48.         helper.close();  
  49.         helper = null;  
  50.     }  
  51. }  

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="java">package com.xuan.greendaoencryp;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.annotation.Nullable;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.text.format.DateUtils;  
  7. import android.view.View;  
  8.   
  9. import com.xuan.db.entity.Note;  
  10. import com.xuan.greendaoencryp.presenter.NotePresenter;  
  11. import com.xuan.greendaoencryp.utils.LogUtils;  
  12.   
  13. import java.util.Calendar;  
  14.   
  15. /** 
  16.  * @author xuanyouwu 
  17.  * @email xuanyouwu@163.com 
  18.  * @time 2016-01-07 17:50 
  19.  */  
  20. public class NoteActivity extends AppCompatActivity {  
  21.   
  22.     NotePresenter presenter;  
  23.     Note note;  
  24.   
  25.     @Override  
  26.     protected void onCreate(@Nullable Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_note);  
  29.         presenter = new NotePresenter(this);  
  30.   
  31.         note = new Note();  
  32.         note.setTitle("这是第一个笔记");  
  33.         note.setContent("笔记的内容是greendao");  
  34.         note.setCreateTime(DateUtils.formatElapsedTime(Calendar.getInstance().getTimeInMillis()));  
  35.     }  
  36.   
  37.     public void onAdd(View v) {  
  38.         try {  
  39.             presenter.add(note);  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44.   
  45.     public void onQuery(View v) {  
  46.         try {  
  47.             LogUtils.d("query all:" + presenter.loadAll());  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  
  52.   
  53.     public void onUpdate(View v) {  
  54.         note.setCreateTime(DateUtils.formatElapsedTime(Calendar.getInstance().getTimeInMillis()));  
  55.         try {  
  56.             presenter.update(note);  
  57.         } catch (Exception e) {  
  58.             e.printStackTrace();  
  59.         }  
  60.   
  61.         try {  
  62.             LogUtils.d("update after query all:" + presenter.loadAll());  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.     }  
  67.   
  68.     public void onDelete(View v) {  
  69.         try {  
  70.             presenter.delete(note);  
  71.         } catch (Exception e) {  
  72.             e.printStackTrace();  
  73.         }  
  74.         try {  
  75.             LogUtils.d("delete after query all:" + presenter.loadAll());  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.   
  81.     @Override  
  82.     protected void onDestroy() {  
  83.         super.onDestroy();  
  84.         presenter.close();  
  85.     }  
  86. }  






-----------------------

GreenDao的插入:

插入的方式有很多:

1:daoSession.getNoteDao().insert(note);

   //插入note 如果note指定主键与表中已经存在了,就会发生异常(android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: tb_note._id (code 1555))而插入不进去

 daoSession.insert(note); 同上
 
2: daoSession.getNoteDao().insertOrReplace(note);
      当主键存在的时候会替换,所以能够很好的执行插入操作,推荐
   daoSession.insertOrReplace(note); 同上
3: 原生的sqlite
  
   String insertSql = String.format("insert into %s (%s,%s,%s) values('%s','%s','%s')",
        NoteDao.TABLENAME,
        NoteDao.Properties.Title.columnName,
        NoteDao.Properties.Content.columnName,
        NoteDao.Properties.CreateTime.columnName,
        note.getTitle(),
        note.getContent(),
        note.getCreateTime());
   daoSession.getDatabase().execSQL(insertSql);
4:批量插入
   public void insertBatch(List<Note> notes){
    daoSession.getNoteDao().insertInTx(notes);
  }
GreenDao的更新操作
1:单条更新(唯一性条件是主键相同)
   
   public void update(Note note) throws Exception {
        daoSession.update(note);
      //  daoSession.getNoteDao().update(note);
   }
2:批量更新 
   //批量更新
   public void updateBatch(List<Note> notes) throws Exception {
       daoSession.getNoteDao().updateInTx(notes);
   }
3:原生sql:  
   public void updateSql(String sql){
    //  daoSession.getDatabase().execSQL("update .....");
     daoSession.getDatabase().execSQL(sql);
  }

GreenDao 的删除操作
1:单条删除(唯一性是主见相同)
   public void delete(Note note) throws Exception {
      daoSession.delete(note);
     // daoSession.getNoteDao().delete(note);
   }

2: 单条删除 指定主键删除

   public void delete(long id) {
       daoSession.getNoteDao().deleteByKey(id);
   }
3:批量删除
  public void deleteBatch(List<Note> notes) {
     daoSession.getNoteDao().deleteInTx(notes);
  }
4:批量按主键删除
  // 批量按主键删除
   public void deleteBatchByKey(List<Long> pkIds) {
     daoSession.getNoteDao().deleteByKeyInTx(pkIds);
   }
5:删除所有 
   public void deleteAll() throws Exception {
    daoSession.deleteAll(Note.class);
    //   daoSession.getNoteDao().deleteAll();
  }
6:原始sqlite语句
  daoSession.getDatabase().execSQL(deletesql);

GreenDao 查询操作 也是最复杂的
1:单条查询

  
  1. //按主键查询  
  2. public Note query(long pk) throws Exception {  
  3.    // daoSession.getNoteDao().load(pk);//按主见查询  
  4.     //daoSession.getNoteDao().load(rowId);//按行号查询  
  5.     return daoSession.load(Note.class, pk);  
  6. }  
2: QueryBuilder 复合查询
  
  
  1. public List<Note> queryBuider() throws Exception {  
  2.      //select from tb_note where Content like 'greendao'  
  3.      return daoSession.getNoteDao().queryBuilder().where(NoteDao.Properties.Content.like("greendao")).build().list();  
  4.  }  

   

[java]  view plain  copy
 print ?
  1. public long queryBuider2(long pk) throws Exception {  
  2.      //select count(*) from tb_note where Content like 'greendao'  
  3.      return daoSession.getNoteDao().queryBuilder().where(NoteDao.Properties.Content.like("greendao")).buildCount().count();  
  4.  }  

   

[java]  view plain  copy
 print ?
  1. public void queryBuider3() throws Exception {  
  2.        Cursor cursor = null;  
  3.        try {  
  4.            //CursorQuery 部分查询  
  5.            CursorQuery greendao = daoSession.getNoteDao().queryBuilder().where(NoteDao.Properties.Content.like("greendao")).buildCursor();  
  6.            cursor = greendao.query();  
  7.            while (cursor.moveToNext()) {  
  8.                long id = cursor.getInt(0);  
  9.                String title = cursor.getString(1);  
  10.                String content = cursor.getString(2);  
  11.                String time = cursor.getString(cursor.getColumnIndex(NoteDao.Properties.CreateTime.columnName));  
  12.            }  
  13.        } finally {  
  14.            if (cursor != null)  
  15.                cursor.close();  
  16.        }  
  17.    }  

3:查询所有:

  

[java]  view plain  copy
 print ?
  1. public void queryAll()  
  2. {  
  3.     daoSession.loadAll(Note.class);  
  4.     daoSession.queryBuilder(Note.class).build().list();  
  5.     daoSession.getNoteDao().queryBuilder().build().list();  
  6.     daoSession.getNoteDao().loadAll();  
  7. }  
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页