Android平台下GreenDao的使用

greenDao的介绍

greenDao是Android数据库ORM(object/relational mapping 对象关系映射的简称)的一个典型代表,其他也有ORMLite等,但greenDao在众多的ORM数据库框架中性能是最好,速度也是最快的,在官方网站中有这个对比,感兴趣的同学可以去看看,greenDao在单位时间内可以插入、更新和查询更多的数据,而且提供了大量的灵活通用接口,文章的最后有个插入的测试,当然删除,修改之类的都是一样快。

操作步骤

greenDao需要一个单独的Java工程,具体可以参考github上的链接greenDao源码,下面是本人的具体步骤:

1.在AndroidStudio中选择File-New Model-Java Library新建一个Java项目,生成表的那个文件默认就好,当然你自己也可以自己决定类的名称,创建完项目之后,在build.gradle文件中添加依赖,下面是build.gradle的内容:

apply plugin: 'java'

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'de.greenrobot:greendao-generator:1.3.1'

}

其中compile这一句为引入的依赖,然后编写生成框架的类文件,下面是源码

public class MyClass {

public static void main(String[] args) throws Exception {

Schema schema = new Schema(1000, "com.example.db.bean");//这个目录是存放需要建立数据库的bean的地方

schema.setDefaultJavaPackageDao("com.example.dao");//这个是设置包名,就是那个DAO和master存放的路径

addNote(schema);

new DaoGenerator().generateAll(schema, "./greendaoproject/src/main/java-gen");//这个是指定建立greendao存放的目录

}

private static void addNote(Schema schema) {

Entity note = schema.addEntity("Note");//这是一个表名,对应一个实体Note

note.addIdProperty().primaryKey().autoincrement();

note.addStringProperty("text").notNull();

note.addStringProperty("comment");

note.addDateProperty("date");

Entity student = schema.addEntity("Student");

student.addIdProperty().primaryKey().autoincrement();//设置自动增长

student.addStringProperty("name").notNull();

student.addStringProperty("address").notNull();

student.addIntProperty("age");

student.addIntProperty("phonenumber");

student.addStringProperty("imageurl");

student.addStringProperty("author");

Entity account = schema.addEntity("Account");

account.addIdProperty().autoincrement();

account.addStringProperty("name").notNull();

account.addStringProperty("address").notNull();

account.addStringProperty("number").notNull();

}

}

其中,重要的有那么几句代码:

Schema schema = new Schema(1000, "com.example.db.bean");//这里面第一个参数是版本,第二个参数是存放具体业务bean的地方,比如学生实体,账户实体等

new DaoGenerator().generateAll(schema, "./greendaoproject/src/main/java-gen"); 第二个参数很重要,它代表的是生成那些greenDao中的Dao存放的目录,这个参数可以是绝对路径,也可以是相对路径,但必须存在,可以看到放在了另一个项目的java-gen目录下面,于是新建greendaoproject项目,并在main目录下新建java-gen目录,下面是截图:

看到没,红框的地方就是刚才代码生成的,当然需要执行那个类,如果没有错误就会生成这样一个目录,除此之外,还需要在greendaoproject中指定这个java-gen为源码路径,下面是build.gradle中的指定代码:

然后 同步sync一下,就可以看到目录的颜色跟java一样的了,这代表已经加入了源码路径了。

好了,准备工作已经做好了,现在看看那个目录到底有啥内容吧,前面说过了,加入了3个实体,按道理会生成3个Dao和3个bean,并在指定的路径,实际上确实如此,下面是截图:

看到了吧,自动生成了,其中还生成了DaoMaster和DaoSession,这两个类一般是全局的,官方推荐在自定义的Application中初始化,这样就避免了多次初始化,下面是在自定义的applicaiton中初始化数据库以及获取各种Dao的代码

public class BaseApplication extends Application {

private static BaseApplication mInstance;

//db

private SQLiteDatabase db;

private static DaoMaster daoMaster;

private static DaoSession daoSession;

@Override

public void onCreate() {

super.onCreate();

if (mInstance == null) {

mInstance = this;

}

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, GlobalConfig.DB_NAME, null);

db = helper.getWritableDatabase();

daoMaster = new DaoMaster(db);

daoSession = daoMaster.newSession();

}

public static BaseApplication getInstance() {

return mInstance;

}

public static void setmInstance(BaseApplication mInstance) {

BaseApplication.mInstance = mInstance;

}

public SQLiteDatabase getDb() {

return db;

}

public void setDb(SQLiteDatabase db) {

this.db = db;

}

public static DaoMaster getDaoMaster() {

return daoMaster;

}

public static void setDaoMaster(DaoMaster daoMaster) {

BaseApplication.daoMaster = daoMaster;

}

public static DaoSession getDaoSession() {

return daoSession;

}

public static void setDaoSession(DaoSession daoSession) {

BaseApplication.daoSession = daoSession;

}

public AccountDao getAccountDao() {

return daoSession.getAccountDao();

}

public NoteDao getNoteDao() {

return daoSession.getNoteDao();

}

public StudentDao getStudentDao() {

return daoSession.getStudentDao();

}

}

看到没,首先用DaoMaster的DevOpenHelper获取一个helper,然后用这个helper打开一个实际操作的数据库db ,之后把这个db作为参数传进DaoMaster获取一个DaoMaster,之后用daoMaster获取daoSession,有了daoSession,各种业务Dao就可以写个方法获取了,因为DaoSession管理了所有的Dao,写完之后记得注册自定义的application,好了,下面是开始测试了,我这里只是测试了插入,当然,其他都是一样的,新建一个activity,并写如下代码测试,我这边是测试5000条数据

public class MainActivity extends AppCompatActivity {    private Listlist=new ArrayList<>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

for(int i=0;i<5000;i++){

Account account=new Account();

account.setAddress("测试地址"+i);

account.setName("你好啊,我擦"+i);

account.setNumber("这是号码"+i);

list.add(account);

}

long start=System.currentTimeMillis();

AccountDao accountDao=BaseApplication.getInstance().getAccountDao();

accountDao.insertInTx(list);

long end=System.currentTimeMillis();

Log.d("[app]","耗时为:"+(end-start));

}

}

结果怎样呢,我这边测试了10次,结果如下:

看到没,10次测试,5000条数据,平均在500毫秒左右,比ORMLite快多了,ORMLite是利用反射完成的,需要耗费一点性能,有人会说假如有10万条数据,那岂不是很耗时,呵呵,如果有十万条数据,没必要全部一次性存储,分开存储,就是先存储5000条,然后再存储5000条,这样就好,当然了你可以开一个线程去存储,毕竟你不可能一下子展示10万条数据,对吧,当你看完前面的5000条数据的时候,剩下的95000条数据早已经插入数据库啦,这个时候直接获取再展示就好了。好了,今天就写到这儿吧,各位多去实践,多去测试就知道greenDao有多优秀的ORM框架了。

备注:

通常情况下,数据库作为缓存的最佳选择,当然除了数据库,文件也是一个不错的选择,但文件在存储大量数据的时候性能很低的,在项目中,我都是利用greendao来实现收藏功能,就是获取到数据之后先存储在本地,然后需要的时候再获取显示,当然除了收藏功能,其他需要利用缓存的地方也是可以使用greenDao的,因为任何业务都是以对象的形式存在的,即使不是对象,我们也可以构造对象进行存储。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容