greenDao --数据库三方框架,相对于Negative Android ,原生,它的存储速度是很快的,但是相比于Realm还是略有不足,
它和Realm一样,是在编译的时候会生成一些代码,ORM ( 对象关系映射),运行时调用会比其他的快,
它是一个标准的ORM框架,
ORM需要三种东西, 1 数据源
2数据库链接对象
3数据库
说一下它的使用:
首先就是导入依赖,需要三个步骤 ;看一下greenDao在GitHub上的主页
Add the following Gradle configuration to your Android project:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
mavenCentral()//这个可以不添加,在AS中,已经有了,默认添加的是JCenter()这个库,但是添加了也没有错
在这里说一下build.gradle有两个,一个app的还有一个Project的 。他们的区别就是,后者相当于成员变量,可以在新建moule的时候直接使用
这里不建议使用多个module,因为编译速度会大大降低。当然,电脑配置NB的随意啊
转回来:
1 在 build.gradle(Project)中添加
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
2在build.gradle(app)中添加
apply plugin: 'org.greenrobot.greendao'
compile 'org.greenrobot:greendao:3.2.0'
其中
apply plugin: 'org.greenrobot.greendao'这个是一个插件,是一个module运行哪些编译脚本,默认会有一个
apply plugin: 'com.android.application'说明我们运行的脚本是application,是可运行的一个android项目,
添加上这句话 是可以运行greenDao的脚本。
一下是添加完成后的截图
build.gradle(Project):
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }build.gradle(app):
apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.qiaoyanqing.ximalatapractice" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } dataBinding{ enabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.0.1' testCompile 'junit:junit:4.12' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.android.support:recyclerview-v7:25.0.1' compile 'org.greenrobot:greendao:3.2.0' }
现在就可以使用了:
在你要存储的实体类上面加上注解 :
@Entity //这个是实体类的注解 public class FocusImageEntity { @Id //主键,至少加一个 private Long id; private String shortTitle;
然后点击一下 小绿锤子(快捷键 Ctrl +F9)--make Project 让脚本运行一次
如果报错了,不要着急 :这个是因为他会自动生成构造方法,你只需要把你自己创建构造方法删除就好了!!!
它会生成两个构造方法一个是无参数的,一个是全属性的。get和set方法他也会自动生成,你写了也没问题。
然后开始使用
首先要创建表 ,
mSession = DaoMaster.newDevSession(this, "data-db");//添加语句//private DaoSession mSession;// mSession 是成员变量,//DaoMaster.newDevSession()需要两个参数,1是上下文 。2是表名
//个人建议用insertOrreplace,,因为有重复的会替换,比较省事,@Override public void onResponse(Call<HomeEntity> call, Response<HomeEntity> response) {//这里用的是retrofit框架,里面的//onResponse回调方法,
HomeEntity body=response.body();FocusImages images=body.getFocusImages();if (images != null) { mSession.getFocusImageEntityDao().insertOrReplaceInTx(images.getList());}
//打印一下数据库
List<FocusImageEntity> entities = mSession.getFocusImageEntityDao().loadAll();for (FocusImageEntity entity : entities) { Log.d("oncreate",entity.getShortTitle()); }
这里要注意一下,第一次运行的时候,不会打印,退出再次进入就会有了,因为第一次的时候表里面是没有数据的。
还要有非空的判断要不然程序很容易就报错,
//下面查询单条,这里的id要给数据库中有的 ,
List<FocusImageEntity> entities = session.getFocusImageEntityDao().queryBuilder() .where(FocusImageEntityDao.Properties.Id.eq(13056)) .list();//这个也可以使用listLazy(),懒加载 // session.getFocusImageEntityDao().load() for (FocusImageEntity entity : entities) { Log.d(TAG, "onCreate: " + entity.getShortTitle()); }
Properties//属性,.后面会显示所有属性,queryBuilder//构建者模式。where 查询条件,
删除所有,清掉所有数据库的数据 ,他跟添加语句差不多,
mSession.getFocusImageEntityDao().deleteAll();直接给id删除也ok。
//参数是long 类型的key,可以直接传入id,进行操作,找到id指向的数据, mSession.getFocusImageEntityDao().load((long) 15036);
//!!!!!!!!!!!!!!!!!!!!重点来了
最后说一下数据库升级,这个是个坑,官方主页没有说明,看一下源码,
@Override public void onUpgrade(Database db, int oldVersion, int newVersion) { Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); dropAllTables(db, true); onCreate(db); } }数据库升级的时候会删除掉所有表,之前的数据是保存不下来的 ,但是比较好的是有一个Log
dropAllTables(db, true);
public class DaoMaster extends AbstractDaoMaster { public static final int SCHEMA_VERSION = 1; /** Creates underlying database table using DAOs. */ public static void createAllTables(Database db, boolean ifNotExists) { FocusImageEntityDao.createTable(db, ifNotExists); }这个是个坑,真的坑。这个是数据库的源码:可以看到现在的版本是
SCHEMA_VERSION = 1;
然后我们进行升级,升级是在,
build.gradle(app)中
添加: 然后同步
greendao { schemaVersion 2 }//就会发现
public class DaoMaster extends AbstractDaoMaster { public static final int SCHEMA_VERSION = 2; /** Creates underlying database table using DAOs. */ public static void createAllTables(Database db, boolean ifNotExists) { FocusImageEntityDao.createTable(db, ifNotExists); }版本升级了,同样表中数据也没了,