GreenDao的使用

今天来学习下GreenDao的使用。

简单介绍下GreenDao:
  • 性能高,号称Android最快的关系型数据库

  • 内存占用小
  • 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制

  • 支持数据库加密  greendao支持SQLCipher进行数据库加密 

  • 简洁易用的API
GreenDao的使用步骤:

1、在gradle添加:classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

2、在app的Gradle中做如下配置

apply plugin: 'com.android.application'
//使用greendao
apply plugin: 'org.greenrobot.greendao'
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "demo.zouyan.com.greendaodemo"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    //greendao配置
    greendao {
        //版本号,升级时可配置
        schemaVersion 1
	//GreenDao自动生成代码的包名
        daoPackage 'demo.zouyan.com.greendaodemo.gen'
	//自动生成代码的目录
        targetGenDir 'src/main/java'
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    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:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    //greendao依赖
    compile 'org.greenrobot:greendao:3.2.0'
}


3.gradle的配置完成后新建一个实体类

@Entity
public class Person {
    //不能用int
    @Id(autoincrement = true)
    private Long id;
    @Unique
    private String name;
}

@Entity :定义实体类,默认类名即为表名(这里为Person)
@Id :标明主键,括号里可以指定是否自增(注意:要注解为@Id的字段最好用Long型)
@NotNull : 不为null
@Unique :唯一约束
@ToMany : 一对多
@OrderBy : 排序
@Transient :不会创建到数据库表里

然后点击 build -> Make Moudle 'app',就会在gradle里设置的gen包下自动生成DaoMaster,DaoSession,PersonDao等文件以及Person类的有参无参构造还有getter、setter。
4、创建数据库
我的习惯做法是直接放在Application的onCreate里:
 	//创建数据库person.db"
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "person.db", null);
        //获取可写数据库
        SQLiteDatabase db = helper.getWritableDatabase();
        //获取数据库对象
        DaoMaster daoMaster = new DaoMaster(db);
        //获取Dao对象管理者
        session = daoMaster.newSession();

5、封装个Person表的操作类
public class DaoHelper {
    /**
     * 添加数据,如果有重复则覆盖
     *
     */
    public static void insert(Person person) {
        BaseAppliaction.getDaoInstant().getPersonDao().insertOrReplace(person);
    }

    /**
     * 删除数据
     *
     */
    public static void delete(long id) {
        BaseAppliaction.getDaoInstant().getPersonDao().deleteByKey(id);
    }

    /**
     * 更新数据
     *
     */
    public static void update(Person person) {
        BaseAppliaction.getDaoInstant().getPersonDao().update(person);
    }

    /**
     * 查询所有数据
     * @return
     */
    public static List<Person> queryAll() {
        return BaseAppliaction.getDaoInstant().getPersonDao().loadAll();
    }

}
6、试着使用下:
        Person person1 = new Person(1l,"张三");
        DaoHelper.insert(person1);
        person1 = new Person(2l,"张四");
        DaoHelper.insert(person1);
        person1 = new Person(3l,"张五");
        DaoHelper.insert(person1);
        person1 = new Person(4l,"张六");
        DaoHelper.insert(person1);
        List<Person> persons = DaoHelper.queryAll();
        person1.setName("张器");
        person1.setId(2l);
        DaoHelper.update(person1);
        persons = DaoHelper.queryAll();
        DaoHelper.delete(1l);
        persons = DaoHelper.queryAll();
    
GreenDao数据库升级:
数据库升级的时候,直接修改实体类,然后去增加Gradle里的schemaVersion的值就行。但是这么做会导致原来的表被清空。如何避免这问题?前人已经有解决的方法,我在这再次记录下。
1、在reprositories里添加maven
allprojects {
    repositories {
        ......
        maven { url "https://jitpack.io" }
    }
}
2、加一条依赖
compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.0'
3.重写DaoMaster.OpenHelper里onUpgrade:
public class MySQLiteOpenHelper extends DaoMaster.OpenHelper{

    public MySQLiteOpenHelper(Context context, String name) {
        super(context, name);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
            @Override
            public void onCreateAllTables(Database db, boolean ifNotExists) {
                DaoMaster.createAllTables(db, ifNotExists);
            }
            @Override
            public void onDropAllTables(Database db, boolean ifExists) {
                DaoMaster.dropAllTables(db, ifExists);
            }
            //这里是个可变参数,有几个表,后面就可以跟跟几个class
        },PersonDao.class);
    }
}
4、修改Application里的:
        //创建数据库person.db"
//        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "person.db", null);
        MigrationHelper.DEBUG = true;  //if you want see the log info,default is false
        MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "person.db");
做完上面几步在数据库升级时就不会在销毁原来的表在重新创建表了,这样原有数据就能保存了。
最后附上 Demo地址


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值