Android数据缓存框架 - 切换为GreenDao数据库

文章介绍了ORM技术,特别是GreenDao在Android中的应用。ORM允许程序员使用对象模型直接操作数据库,简化了数据库操作。文中展示了如何配置和使用GreenDao,包括添加依赖、定义实体类以及在Application中初始化数据库。此外,还讨论了如何自定义数据缓存框架,通过重写CacheHolder以适应GreenDao的数据库操作。
摘要由CSDN通过智能技术生成

数据库技术博大精深,是当今互联网的基础。前有DB2,后有MySQL、Oracle,然后数据库ORM框架也应运而生。没错,我们这一期讲一讲数据库的ORM技术。

什么是ORM?ORM,全称为Object-Relational Mapping(对象关系映射),由于数据库操作使用到SQL,而SQL是给运维用的,我们程序直接拼接SQL则异常繁琐。所以,就有人提出,这部分繁琐的事情能不能交给框架来做?答案是肯定的。

要理解ORM,首先要掌握Java中比较重要的一个概念,泛型。没有它,就没法很好的开发通用型软件架构。泛型,本质上还是对事物进行了抽象。比如我们现在没法实现的伟大事业,我们可以先想想,它大概是怎样的?比如改造火星。有句话叫做,想象力比知识更重要,这就是抽象的魅力所在。

ORM框架,一定是万能的。给我Book的对象我就能存Book,给我Note的对象我就能存Note。即我使用程序员容易理解的对象模型,来直接操作数据库,那么DAO,数据访问对象,就是桥梁。它是直接跟数据库和SQL打交道的,我们在上层定义一个抽象层来连接真实业务。

在Android端,就有这么一个很好的ORM框架,来帮助我们将数据存储到数据库,它就是GreenDao。我们来看看怎么使用吧!

**项目依赖GreenDao的插件**

在项目根目录的build.gradle依赖插件
```
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
```
并在app模块的build.gradle使用它
```
apply plugin: 'org.greenrobot.greendao'
android {
    // 定义APT生成代码的位置和包名
    greendao {
        schemaVersion 1 daoPackage 'com.xx.greendao'
        targetGenDir 'src/main/java'
    }
}
```

**app模块依赖GreenDao的包**
```
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' 
    implementation 'org.greenrobot:greendao-generator:3.2.2'
}
```

**定义实体类**
```
@Entity 
public class Note {
    @Id(autoincrement = true) private long id;
    private String text;
    private String comment;
    private Date date;
}
```

**在Application中初始化数据库**

```
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "note", null); 
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
DaoSession daoSession = master.newSession();
NoteDao noteDao = daoSession.getNoteDao();
```
通过DaoSession拿到操作具体某张表的DAO。

打住,不好意思,搞错了。我们今天不完全是讲解怎么用GreenDao数据库的,这样使用的文章很多。
增删改查都是通过调用dao的方法就可以了。言归正题,我们自定义的数据缓存框架怎么切换到GreenDao进行缓存?

**定义GreenDaoDatabaseCacheRepository**
```
package dora.cache.repository

import android.content.Context
import dora.cache.holder.*
import me.itangqi.greendao.DaoSession

abstract class GreenDaoDatabaseCacheRepository<T>(context: Context)
    : BaseDatabaseCacheRepository<T>(context) {

    override fun createCacheHolder(clazz: Class<T>): CacheHolder<T> {
        return GreenDaoCacheHolder<T>(getDaoSession(), clazz)
    }

    override fun createListCacheHolder(clazz: Class<T>): CacheHolder<MutableList<T>> {
        return GreenDaoListCacheHolder<T>(getDaoSession(), clazz)
    }

    abstract fun getDaoSession() : DaoSession
}
```
**定义两个CacheHolder**
```
package dora.cache.holder

import de.greenrobot.dao.AbstractDao
import dora.db.OrmLog
import dora.db.builder.Condition
import me.itangqi.greendao.DaoSession

class GreenDaoCacheHolder<T>(var session: DaoSession, var clazz: Class<T>) : CacheHolder<T> {

    private lateinit var dao: AbstractDao<T, Long>

    override fun init() {
        dao = session.getDao(clazz) as AbstractDao<T, Long>
    }

    override fun queryCache(condition: Condition): T? {
        return session.callInTx {
            dao.queryRaw(condition.selection, *condition.selectionArgs)[0]
        }
    }

    override fun removeOldCache(condition: Condition) {
        try {
            dao.deleteInTx(queryCache(condition))
            OrmLog.d("removeOldCache:true")
        } catch (e: Exception) {
            OrmLog.d("removeOldCache:false")
        }
    }

    override fun addNewCache(model: T) {
        try {
            dao.insertInTx(model)
            OrmLog.d("addNewCache:true")
        } catch (e: Exception) {
            OrmLog.d("addNewCache:false")
        }
    }

    override fun queryCacheSize(condition: Condition): Long {
        return session.callInTx {
            dao.count()
        }
    }
}
```
```
package dora.cache.holder

import de.greenrobot.dao.AbstractDao
import dora.db.OrmLog
import dora.db.builder.Condition
import me.itangqi.greendao.DaoSession

class GreenDaoListCacheHolder<T>(var session: DaoSession, var clazz: Class<T>) : ListCacheHolder<T>() {

    private lateinit var dao: AbstractDao<T, Long>

    override fun init() {
        dao = session.getDao(clazz) as AbstractDao<T, Long>
    }

    override fun queryCache(condition: Condition): MutableList<T>? {
        return session.callInTx {
            dao.queryRaw(condition.selection, *condition.selectionArgs)
        }
    }

    override fun removeOldCache(condition: Condition) {
        try {
            dao.deleteInTx(queryCache(condition))
            OrmLog.d("removeOldCache:true")
        } catch (e: Exception) {
            OrmLog.d("removeOldCache:false")
        }
    }

    override fun addNewCache(models: MutableList<T>) {
        try {
            dao.insertInTx(models)
            OrmLog.d("addNewCache:true")
        } catch (e: Exception) {
            OrmLog.d("addNewCache:false")
        }
    }

    override fun queryCacheSize(condition: Condition): Long {
        return session.callInTx {
            dao.count()
        }
    }
}
```
以上一个是非list模式的,一个是list模式的。切换数据库ORM框架主要就是去重写这两个CacheHolder,用该数据库dao的方法来实现我们的CacheHolder接口。BaseDatabaseCacheRepository更详细的使用,也看我的另两篇文章【Android数据缓存框架 - 切换为Room数据库】https://juejin.cn/post/7158833826771730462 和 【Android数据缓存框架 - 内置ORM功能】https://juejin.cn/post/7139760822309355534 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Android中有多个数据缓存框架可供选择,其中一个常用的框架Android Glide。Glide是一个开源的图片加载和缓存处理的第三方框架,它内部已经实现了缓存策略,使得开发者可以更方便地加载和显示图片。使用Glide,开发者只需要几行简单明晰的代码,就可以完成大多数图片从网络或本地加载并显示的功能需求。Glide的缓存数据的操作是通过DiskLruCache.Editor这个类完成的,开发者可以通过调用DiskLruCache的edit()方法来获取Editor实例,然后进行缓存数据的操作。\[1\]\[2\]在Android布局文件中,可以使用ImageView来显示图片,如下所示的布局文件代码片段所示:\[3\] #### 引用[.reference_title] - *1* *3* [Android图片加载与缓存开源框架Android Glide](https://blog.csdn.net/zhangphil/article/details/45535693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android缓存机制&一个缓存框架推荐](https://blog.csdn.net/mazhidong/article/details/69676830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dora丶Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值