android面试(16)-数据库存储框架greendao

在进行项目开发时,免不了要实现存储功能,也就是我们常说的数据持久化,我们知道,android五种存储方式,网络存储,数据库存储,文件存储,SharePreference和contentprovider,其中数据库存储是比较常用的一种方式,但是android提供的原生的sqlite用起来比较麻烦,还需要自己进行封装,所以今天就来讲一讲greendao;

greenDAO是一种Android数据库ORM(object/relational mapping)框架,与OrmLite、ActiveOrm、LitePal等数据库相比,单位时间内可以插入、更新和查询更多的数据,而且提供了大量的灵活通用接口。

1.使用方法:

(1)配置环境(Android Studio):

       (A)首先将工程目录下的build.gradle文件配置成

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        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
    }
}

               主要是在repositories加入mavenCentral(),再在dependencies中加入依赖;

       (B)再将app目录下的build.gradle的文件配置成

                先加入greendao的插件:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'

                再加入依赖

compile'org.greenrobot:greendao-generator:3.1.0'

               最后再在android下配置

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
greendao{
    schemaVersion 1
    daoPackage'com.example.mytest.greendao.gen'
    targetGenDir'src/main/java'
}
 schemaVersion---->指定数据库schema版本号,迁移等操作会用到
 daoPackage-------->通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao

 targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而   不是build中,这样就不用额外的设置资源目录了

配置好这些之后,同步一下;

接下来就是代码的编写了:

首先编写实体类

@Entity
public class User {
    @Id
    private String id;
    private String name;
} 

这时点击makeProject,文件目录就会发生变化;


首先User类会自动生成get,set方法

@Entity
public class User {
    @Id
    private String id;
    private String name;
    @Generated(hash = 1037321026)
    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }
    @Generated(hash = 586692638)
    public User() {
    }
    public String getId() {
        return this.id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

然后会在你之前配置的targetgenDir目录下,生成DaoMaster,DaoSession和UserDao;


DaoManager是我自己封装的工具类,这里的DaoMaster是数据库的“管家”,主要功能是负责数据库的创建和删除,并将数据库存储到Session缓存中,DaoSession提供了方便的方法去让你操作数据库,并且是数据库的session的缓存,UserDao是根据User实体类来生成的对实体类的操作的具体实现类;

有了这些类,我们就可以方便的去操作数据库了;

(2)具体操作:

首先编写一个dao的管理类,初始化数据库,获取相应的操作对象

public class DaoManager {
    private static DaoManager mInstance;

    private DaoMaster daoMaster;
    private DaoSession daoSession;

    private DaoManager(){
        DaoMaster.DevOpenHelper devOpenHelper=new DaoMaster.DevOpenHelper(MyApplication.getContext(),"my_db",null);
        daoMaster=new DaoMaster(devOpenHelper.getWritableDatabase());
        daoSession=daoMaster.newSession();
    }
    public DaoMaster getDaoMaster(){
        return daoMaster;
    }

    public DaoSession getDaoSession(){
        return daoSession;
    }

    public static DaoManager getmInstance(){
        if (mInstance==null){
            mInstance=new DaoManager();
        }
        return mInstance;
    }

}

再编写实体类的管理类,对数据库表的初始化,获取实体类的操作对象

public class EntityManager {
    private static EntityManager manager;
    private UserDao userDao;

    public UserDao getUserDao(){
        return DaoManager.getmInstance().getDaoSession().getUserDao();
    }

    public static EntityManager getManager(){
        if (manager==null){
            manager=new EntityManager();
        }
        return manager;
    }
}

代码测试:增删改查

//增加
private void insertData() {
    userDao.insert(new User("001","pgg"));
}
//删除
private void deleteData() {
    User pgg = userDao.queryBuilder().where(UserDao.Properties.Name.eq("pgg")).build().unique();
    if (pgg!=null){
        userDao.deleteByKey(pgg.getId());
    }
}

//更新
private void updateData() {
    User pgg = userDao.queryBuilder().where(UserDao.Properties.Name.eq("pgg")).build().unique();
    if (pgg!=null){
        pgg.setName("pggpg");
        userDao.update(pgg);
        Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(MyApplication.getContext(), "修改失败", Toast.LENGTH_SHORT).show();
    }
}

//查找
private void queryData() {
    User load = userDao.load("001");
    tv_id.setText("id="+load.getId());
    tv_name.setText("name="+load.getName());
}

这里只不过使用了greendao的几种方法,增删改查还有很多的方法,需要的可以在官网上查询;

2.源码分析

greendao的源码我准备从他的四个核心类去分析,DaoMaster,DaoSession,XXXDao,XXXEntity;

(1)DaoMaster:DaoMaster是GreenDao框架管理类,该类对数据库相关管理操作进行封装

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值