GreenDao3.0使用详解

随着移动端的业务量的增大和用户体验的提高,SQLite的需求很明显了,大大小小的项目几乎成了必备,用我们项目经理的话来说:

1、不用管他什么数据,为了体验,先缓存一下!

2、什么?网络不好导致的?看什么,缓存啊!!!

真不知道他是在哪里听到的这个词,唉!

在他看来,缓存是如此简单的一件事情,当然,缓存其实并不难,就是有点麻烦而已!大笑

之前我一直是用Realm,目前Realm被人称为移动端的新一代王者,但是对于知识,哪有嫌多的呢。


一、GreenDao和Realm对比

我在网上找了一张图片,很能说明问题:


在小量数据的查询与删除等操作中,两者的差距基本可以忽略不计,超过同时插入、删除、查询1000条以上的数据分析得出。GreenDao在删除操作中,占明显优势,而Realm在添加与查询方面优于GreenDAO。各有千秋,看自己的选择。


二、GreenDao配置

1、导入相应的包

compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'
2、配置app的Gradle

apply plugin: 'org.greenrobot.greendao'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}

greendao {
    schemaVersion 1
    daoPackage 'com.example.anonymous.greendao.gen'
    targetGenDir 'src/main/java'
}
3、配置greenDao

greendao {
    schemaVersion 1
    daoPackage 'com.example.anonymous.greendao'
    targetGenDir 'src/main/java'
}

 schemaVersion---->指定数据库schema版本号,迁移等操作会用到
 daoPackage-------->通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao
 targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了


整体配置预览:

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

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}

greendao {
    schemaVersion 1
    daoPackage 'com.example.anonymous.greendao'
    targetGenDir 'src/main/java'
}

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.anonymous.realmdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile'org.greenrobot:greendao:3.0.1'
    compile'org.greenrobot:greendao-generator:3.0.0'
}

三、编写实体类(对应的是数据库的每张表)

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

@Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的


就这么简单含有两个字段的实体类

然后点击这个按钮



builder完之后会有两个地方发生了变化



这是GreenDao自动为你生成的,路径就是你在gradle中配置的路径

现在只有一个User表,如果再添加一个Age实体类,你在点击Make Project按钮,他还会把AgeDao自动生成出来


四、增、删、改、查

在增、删、改、查之前第一步做的就是需要对数据库进行初始化,不可能就这样直接对实体类操作,这样不太现实的,否则为什么GreenDao会自动生成这么多代码呢?

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);  
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());  
DaoSession daoSession = daoMaster.newSession();  
UserDao userDao = daoSession.getUserDao();  
my-db是数据库的名字,自己随便写就行。

通过GreenDao生成的代码,我们可以获取到实体类的实例,也就是数据库表的实例,这样我们才能操作数据库


1、增加

User user1 = new User(null,"zhangsan");
userDao.insert(user1);

2、删除

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();  
if(findUser != null){  
    userDao.deleteByKey(findUser.getId());  
}  

3、修改

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();  
if(findUser != null) {  
    findUser.setName("lisi");  
    userDao.update(findUser);  
    Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();  
} else {  
    Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();  
}  

把zhangsan改成lisi

4、查询

List<User> userList = userDao.queryBuilder()  
       .where(UserDao.Properties.Id.notEq(1)) 
       .limit(5)  
       .build().list(); 

查询语句是数据库操作最多的,语句也比较复杂,具体的语句请去看官网

简单封装

其实这样写代码,作为程序员并不能满足,最起码的重用还是需要的,所以简单的封装一下吧

我们需要添加几个类来负责代码的重用工作,先看一下整体的工程结构:


1、MyApplication:返回Context对象

2、DaoManager:初始化数据库,获取相应的操作对象

3、EntityManager:对数据库表的初始化,获取实体类的操作对象

public class MyApplication extends Application {
    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext() {
        return mContext;
    }
}


/**
 *  greenDao管理类
 */
public class DaoManager {
    private static DaoManager mInstance;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    private DaoManager() {
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);
        DaoMaster mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }

    public DaoSession getSession() {
        return mDaoSession;
    }

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



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

    /**
     * 创建User表实例
     *
     * @return
     */
    public UserDao getUserDao(){
        userDao = DaoManager.getInstance().getSession().getUserDao();
        return userDao;
    }

    /**
     * 创建单例
     *
     * @return
     */
    public static EntityManager getInstance() {
        if (entityManager == null) {
            entityManager = new EntityManager();
        }
        return entityManager;
    }
}

三个东西一看便知,但是这个东西怎么用呢?

// TODO: 2017/1/1 一句话就把相应的数据库表的实例返回,进行操作  
UserDao userDao = EntityManager.getInstance().getUserDao();
User user1 = new User(null,"zhangsan");
userDao.insert(user1);

DaoManager和EntityManager主要作用是对数据库和表的初始化工作抽出来作为复用,在Activity中使用的时候,我们可以直接操作表,不需要在初始化工作了,这篇文章作为我的学习笔记,希望也能为看到的朋友提供帮助!




  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
USB 3.0是一种高速传输协议,也称为超级速度USB。它是迄今为止USB传输协议中最新和最快的版本。 USB 3.0的主要特点是传输速度更快。与USB 2.0相比,它提供了更高的传输带宽和更快的数据传输速度。USB 3.0的传输速度可达到每秒5Gbps,相当于传输一个高清电影只需几秒钟的时间,大大提高了数据传输的效率。 除了更快的传输速度外,USB 3.0还具有更高的功率输出。它可以为连接的设备提供更大的供电能力,以满足更多高功率设备的需求。此外,它还兼容之前的USB设备。这意味着您可以将USB 2.0或更旧的设备连接到USB 3.0接口上,并且它们将能够正常工作。 USB 3.0还引入了新的插头设计。它的插头具有额外的接地针脚,以提供更好的防护和传输稳定性。此外,它的插头和插槽具有向后兼容性,这意味着您可以将USB 2.0插头插入USB 3.0插槽中,并且相反也成立。 USB 3.0还引入了新的数据传输协议。它使用了多个并行通道,以实现更高的传输速度。此外,它还支持全双工传输,使得同时进行读写操作成为可能。这意味着您可以在同一时间内实现更高的数据吞吐量。 总之,USB 3.0是一种具有更高传输速度、更大供电能力和更好插头设计的USB传输协议。它为用户提供了更快、更可靠的数据传输体验,是现代计算机及其设备中常用的接口之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anonymous-OS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值