greenDao 使用

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是表名

//添加语句

 
  
@Override   
public void onResponse(Call call, Response response) {
//这里用的是retrofit框架,里面的
 
  
//onResponse回调方法,

HomeEntity body=response.body() ;FocusImages images=body.getFocusImages() ; if (images != null) { mSession.getFocusImageEntityDao().insertOrReplaceInTx(images.getList()) ;} //个人建议用insertOrreplace,,因为有重复的会替换,比较省事,

//打印一下数据库

List entities = mSession.getFocusImageEntityDao().loadAll();
for (FocusImageEntity entity : entities) {
    Log.d("oncreate",entity.getShortTitle());
}


这里要注意一下,第一次运行的时候,不会打印,退出再次进入就会有了,因为第一次的时候表里面是没有数据的。

还要有非空的判断要不然程序很容易就报错,

//下面查询单条,这里的id要给数据库中有的 ,

  List 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 查询条件,



下面说一下删除,删除是按照id删除的,就算是删除对象,归根结底也是根据id的指向

删除所有,清掉所有数据库的数据 ,他跟添加语句差不多,

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);
    }
版本升级了,同样表中数据也没了,





你可能感兴趣的:(greenDao 使用)