Room 引用复杂数据

Android数据库框架 Room的使用 AndroidX+Kotlin Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。 本文简单介绍Room的使用,增删查改和数据结构升级。以及使用时需要注意的问题 阅读详情

https://developer.android.com/training/data-storage/room/referencing-data?hl=zh-cn#converter-initialization

在使用room的时候,如果要保存的entity中有 bitmap,或者其他复杂的对象,我们没办法直接保存,这个时候,就涉及到类型转换

https://medium.com/@rasim0042/type-converter-for-room-db-2700e968a6d5

比如下面这个entity,想要直接保存bitmap,这个时候,我们需要告诉room如何进行类型转换

@Entity(tableName = "running_table")
data class Run(
    var img: Bitmap? = null,
    var timestamp: Long = 0L,
    var avgSpeedInKMH: Float = 0f,
    var distanceInMeters: Int = 0,
    var timeInMillis: Long = 0L,
    var caloriesBurned: Int = 0
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null
}

写一个Converters,具体的转换方法上添加@TypeConverter注释

class Converters {

    @TypeConverter
    fun toBitmap(bytes: ByteArray): Bitmap {
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    }

    @TypeConverter
    fun fromBitmap(bmp: Bitmap): ByteArray {
        val outputStream = ByteArrayOutputStream()
        bmp.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
        return outputStream.toByteArray()
    }
}

然后将这个注册到数据库

@Database(
    entities = [Run::class],
    version = 1
)
@TypeConverters(Converters::class)
abstract class RunningDatabase : RoomDatabase() {

    abstract fun getRunDao(): RunDAO
}

这样在保存数据的时候就可以直接操作了

 @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertRun(run: Run)

读取也是可以直接返回

 @Query("SELECT * FROM running_table ORDER BY distanceInMeters DESC")
    fun getAllRunsSortedByDistance(): LiveData<List<Run>>

Android Jetpack架构组件之 Room(使用、源码篇) 1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。 Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件: 带你领略Android Jet... 阅读详情

相关推荐

【Android】Room—数据库的基本操作

在Android开发中,数据持久化是一个不可或缺的部分。随着应用的复杂度增加,选择合适的数据存储方式变得尤为重要。Room数据库作为Android Jetpack架构组件之一,提供了一种抽象层,使得开发者能够以更简洁、更安全的方式操作SQLite数据库。本文将带你深入了解Room数据库的基本概念、使用方式以及最佳实践。

2301_79828182的博客 3679

第四章:Room数据库直接存储对象(二进制数据,Android面试必问的HashMap

获取Cache数据库操作对象 @return */ public abstract CacheDao getCacheDao(); 创建缓存数据类(注意一定要序列化Serializable) package cn.yumakeji.jetpackroomstudy.bean; import java.io.Serializable; public class CacheBean implements Serializable { private String name; private ..

m0_65322636的博客 1784

理解Room数据库的迁移(Migration)

文章目录数据库迁移的引擎SQLite API 都干了些啥Room 都干了些啥迁移 SQLite API 代码 到 Room情景一:保持数据库版本不变 --- app崩溃第一步:尝试打开数据库情景二:版本更新了,但是没有提供迁移策略 --- app崩溃第一步:更新数据库版本从1(已经安装到设备上了)到2情景三:版本更新了,回退到破坏性迁移 --- 数据库数据被清空了第一步:尝试从版本1更新到版本2第二步:尝试重新打开数据库情景四:版本更新了,也提供了迁移策略 --- 数据健在第一步:尝试更新版本1到版本2第二

成长的烧年 1万+

android room 类型转化

Android Room 类型转化的深度解析 Android Room 是 Google 为 SQLite 数据库引入的一个持久化库,它简化了数据库操作,并提供了丰富的功能。在使用 Room 时,你可能会遇到需要将复杂类型转换为可存储在数据库中的基本类型的情况。本文将详细阐述 Android Room 的类型转换,并通过代...

weixin_28926205的博客 507

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 405

MuMu模拟器过检测实战:从硬件伪装到API欺骗的完整避坑指南

本文详细介绍了MuMu模拟器过检测的实战技术,从硬件伪装到API欺骗的全方位解决方案。通过修改CPU/GPU信息、内存分布、系统属性和行为模拟等关键技术,帮助用户有效绕过现代应用的模拟器检测机制,提升模拟器的隐蔽性和稳定性。

xxx12的博客 1406

第四章:Room数据库直接存储对象(二进制数据,满足app缓存的功能实现)

基本使用请看: 第三章:Room数据库使用:https://huangxiaoguo.blog.youkuaiyun.com/article/details/106430453 构建数据库字段 /** * 表名 * tableName = "app_cache" */ @Entity(tableName = "app_cache") public class Cache implements Serializable { //PrimaryKey 必须要有,且不为空,autoGenerat..

黄孝果的博客 2502

逍遥模拟器改真机参数全指南:从ARM伪装到电池传感器模拟

本文提供逍遥模拟器深度伪装实战指南,重点讲解如何通过修改ARM架构、系统属性和模拟传感器数据,使其在硬件信息、电池状态等维度逼近真实设备,有效规避应用检测。文章详细介绍了使用Magisk模块、LSPosed框架进行设备指纹伪装和动态数据模拟的策略,帮助用户实现从静态信息到动态行为的全方位真机模拟。

weixin_29279101的博客 453

Android架构组件Room的使用

Android架构组件Room的使用 Room其实就是一个orm,抽象了SQLite的使用,但是它作为Android的亲儿子orm,并且原生支持LiveData和Rxjava嵌套使用,学习一下还是不错的。 Room有3个主要组件 Database :数据库 Entity : 代表数据库一个表结构 Dao : 包含访问数据库的方法 简单使用 添加Google Maven仓库 allproject...

weixin_34235135的博客 396

R语言环境下Bibliometrix与Biblioshiny的安装与配置指南

本文提供了在R语言环境下安装与配置Bibliometrix和Biblioshiny的详细指南。内容涵盖R与RStudio的安装、Bibliometrix包的安装避坑方法,以及如何启动Biblioshiny图形界面进行文献计量分析。重点解决了安装过程中的常见网络与依赖问题,帮助科研人员快速搭建高效的文献分析环境。

jwt8token的博客 1147

安卓手机部署酒馆 SillyTavern 全攻略(Termux 本地安装教程)

本文详细介绍了如何在安卓手机上通过 Termux 环境本地部署 SillyTavern,一个功能丰富的角色扮演对话 AI。步骤包括安装 Termux、Git,克隆 SillyTavern 仓库,安装 Node.js 和依赖,启动 SillyTavern,以及可选的高阶玩法——安装 TAI-Extras 扩展模块。文章还提供了常见问题的解决方案和优化技巧,如更新 SillyTavern、处理报错、文件访问、添加快捷命令和禁用安卓后台进程杀死。通过本教程,用户可以在安卓手机上体验本地部署的 AI 对话,享受更高

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

Room框架学习、使用

Room Persistence Library(官方介绍) 官方ORM(Object Relational Mapping)框架专题 Google官方推出的Android架构组件系列文章(六)Room持久化库 Room 的官方API 可以查看这里 ##介绍 Room是谷歌官方的数据库ORM(对象关系映射)框架,使用起来非常方便。 Room提供了一个SQLite之上的抽象层,使得在充分利用SQ...

麻薯帅比的博客 5615

Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 安装教程 2.1 安装OpenClaw 2.2 配置模型 2.3 对话 3. 后续使用步骤 4. 关闭程序

weixin_43178406的博客 11万+

使用 Room 引用复杂数据

使用 Room 引用复杂数据 Room 提供了在基元类型和盒装类型之间进行转换的功能,但不允许实体之间进行对象引用。本文档介绍了如何使用类型转换器,以及 Room 为何不支持对象引用。 使用类型转换器 有时,您的应用需要使用自定义数据类型,其中包含您想要存储到单个数据库列中的值。要为自定义类型添加此类支持,您需要提供一个 TypeConverter,它可以在自定义类与 Room 可以保留的已知类型...

max 915

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4137

XCP实战系列介绍01-测量与标定底层逻辑介绍

XCP-测量与标定底层代码实现介绍,通过对相关API调用关系介绍加深开发人员对其功能的了解。

initiallizer的博客 1万+

(六)使用Room引用复杂数据

Room提供了在原始类型和盒装类型之间进行转换的功能,但不允许实体之间的对象引用。 本文档介绍了如何使用类型转换器以及Room不支持对象引用的原因。 一、使用类型转换器 有时,您的应用需要使用您希望将其值存储在单个数据库列中的自定义数据类型。 要为自定义类型添加此类支持,您需要提供TypeConverter,它将自定义类转换为Room可以保留的已知类型。 例如,如果我们想要保留Date的实例,我们可以编写以下TypeConverter来在数据库中存储等效的Unix时间戳: public class

chuyouyinghe的专栏 719

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android NDK开发详解应用数据和文件之使用 Room 引用复杂数据

原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 activity 和访问实体设备组件,例如传感器和触控输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用

hnjzfwy的博客 179

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android Room 官方指南

官方文档翻译 简介 导入库 使用Room保存本地数据到数据库中 使用Room实体定义数据 使用主键 注解声明与唯一性 定义对象之间的关系 创建嵌套对象 使用Room DAOs访问数据 定义查询方法 插入 更新 删除 信息查询 简单查询 将参数传递到查询中 返回列的子集 传递参数集合 可观察的查询 RXJava的响应式查询 直接Cursor访问 多...

itTalmud的博客 1794

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 官方数据库Room --- 复杂数据

源文档链接 复杂数据 Room提供了基本类型到包装类型的转换,但是不允许实体类型之间的引用。这里解释如何使用类型转换,并且Room为何不允许 使用类型转换 有时,可能需要将自定义对象存在单独一列中。为了实现这个需求,需要添加TypeConverter,来讲自定义对象转成Room可处理的类型 例如:想要保存Date类型的对象,可以这样写 编写converter public cl...

chen_white的博客 4861

android架构组件之Room

Room使用主键使用Room持久性库时,可以将相关字段集合定义为实体。 对于每个实体,在关联的数据库对象中创建一个表来保存这些项目。默认情况下,Room会为实体中定义的每个字段创建一个列。 如果实体具有不想保留的字段,==则可以使用@Ignore对其进行注释==。 您必须通过Database类中的实体数组引用实体类。主键: 每个实体必须有一个字段作为主键 使用@PrimaryKey标识@Prim

kstg3646426的专栏 1188

sqlite 表与表之间的关系_Room 中的数据库关系

设计一个关系型数据库很重要的一部分是将数据拆分成具有相关关系的数据表,然后将数据以符合这种关系的逻辑方式整合到一起。从 Room 2.2 的稳定版开始,我们可利用一个 @Relation 注解来支持表之间所有可能出现的关系:一对一、一对多和多对多。Room 2.2https://developer.android.google.cn/jetpack/androidx/releases/...

weixin_39634878的博客 504

Android JetPack Room

JetPack Room1. Room 的优势2. 主要组件3. 简单使用介绍3.1 导包3.2 User实体类,UserDao接口,UserDataBase4. 数据库的升级4.1 直接升级4.2 Migration方式,手动迁移4.3 autoMigrations方法,自动迁移5. exportSchema数据库升级测试记录6. 监听表数据变化6.1 LiveData方式6.2 Flow流的方式6.3 Rxjava的方式7. 引用复杂数据8. 预填充 Room 数据库8.1 从应用资源中填充8.2 从文

Gary__123456的博客 1871

『Android』复杂数据的存储SQLite和Room框架

注意:不是教程只是笔记,如有错误欢迎批评指正常用的数据库 sqlserver oracle mysqlAndroid嵌入式数据库SQLiteSQLite数据库支持SQL语法和ACID事务,适用于存储大量的关系型数据eg:qq的聊天列表学习强国的新闻创建数据库需要使用到一个抽象类它有两个抽象方法::创建数据库:升级数据库和用于创建或打开一个数据库,返回一个可对数据读写操作的对象,两者的区别是:当数据库不可写入时(如磁盘满了),方法返回的对象将以只读的方式打开数据库,方法则会出现异常有3个构造方法可供重写,其中

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 3958

android中Room数据库的基本使用

Room是Google官方推荐使用的数据库,相比较某些优秀数据库框架来说,不用过于担心某天库会停止维护,且访问数据库非常流畅,并且提供了与常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,譬如@Database、@Dao、@Entity、@Query、@Insert、@Update、@Detele等的注解,可以使用简单代码实现相比以前SQLite更复杂的代码的效果,这点儿有点儿类似于java世界里的mybatis。它包含了一个抽象方法wordDao(),用于获取WordDao接口的实例。

Gefangenes的博客 5249
上一篇: 关于Android的存储
下一篇: 关于coroutine的异常捕获和取消机制
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值