一、Room 预填充数据简介 在 Android 中使用 Room 框架 , 创建 SQLite 数据库时 , 有时需要预填充一些数据 , 这些数据一般都是来自 assets 资源目录 ; 如果用户首次打开应用...> { mCopyFromAssetPath = databaseFilePath return this } 2、原执行结果 如果不设置 数据库 初始化数据 , 则输出的日志如下 :...8, name='Tom', age=18), Student(id=9, name='Jerry', age=16)] 五、预填充数据报错信息 - 数据库字段属性必须完全相同 ---- 期间遇到该错误..., 这里 在 DB Browser for SQLite 工具中设置 age 字段为非空字段 ; 右键点击数据库表 , 在弹出的右键菜单中 , 选择 " 修改表 " 选项 , 将 age 属性设置为非空...import android.util.Log import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase
(1, 2) 即可 ; 从 数据库版本 1 升级为 数据库版本 3 , 先执行 Migration(1, 2) , 再执行 Migration(2, 3) ; Room 提供了简便的方式来 处理 Android..., 该列不允许为空 , 并且默认值为 1 ; 可以使用类似的 ALTER TABLE 语句来修改表结构,添加、修改或删除列等操作 ; alter table student 表示对 student 数据库表...进行修改 ; add column sex integer 表示 要添加的新列名为 “sex” , 数据类型为 integer , 即整数类型 ; not null 表示该新列不允许为空值,即在插入或更新数据时...,必须为该列提供非空值。...import android.util.Log import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase
; plugins { id 'com.android.application' } 如果使用 Kotlin 语言开发 , 需要在 android 插件 的基础上 额外导入 kotlin 和...kotlin-kapt 插件 ; plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android'...id 'kotlin-kapt' } 导入依赖 导入依赖库区别 : 如果导入错误 , 就会出现 如果使用 Java 语言开发 , 需要使用 annotationProcessor 导入注解处理器 , 用于在编译期间生成代码...使用 @ColumnInfo 注解定义 , 该注解中的参数 : name = “id” 定义了 数据表的列名称 ; typeAffinity = ColumnInfo.INTEGER 定义该 列字段的类型是...( Java ) //annotationProcessor 'androidx.room:room-compiler:2.2.5' 完整代码如下 : plugins { id 'com.android.application
当在编写SQL查询时遇到问题时,请仔细检查语法、表名、列名、引号和连接条件等方面是否有错误,并根据具体情况进行修正 错误的表名或列名: SELECT Namee, Age FROM Users; 解决方法...:检查表名和列名的拼写是否正确,并确保它们与数据库中的实际对象相匹配。...ON Orders.CustomerID = Customers.OrderID; 解决方法:检查连接条件是否正确匹配相关列。...未正确处理空值: SELECT AVG(Price) FROM Products; 解决方法:在使用聚合函数计算结果时,如果存在空值,可以使用COALESCE或IFNULL函数来处理。..._1d WHERE dt >= '20190601' AND dt <= '20190605' AND room_id = 99999;
首语 Android使用SQLite作为数据库存储数据,但是SQLite使用繁琐且容易出错,有许多开源的数据如GreenDAO、ORMLite等,这些都是为了方便SQLite的使用而出现的,Google...",childColumns="当前表列名",onDelete时 NO_ACTION(默认,不操作);RESTRICT(相关联);SET_NULL(设置为Null);SET_DEFAULT(设置为默认值...= {"name","age"},unique = true)}) public class Student extends Score{ //PrimaryKey 主键,必须要有,且不为空,...需要注意的是:启用Fts的表必须使用Integer类型的主键,且列名为“rowid”。 如果表支持以多种语言显示内容,可以使用languageId指定用于存储每一行语言信息的列。...此支持在Entity的两个实例被视为相等(如果这两个实例的列包含相同的值)时尤为有用。
一、Room#Migration 迁移工具升级数据库 Room Migration 数据库迁移工具 是 Android Jetpack Architecture Components ( 架构组件 )...的一部分 , 它是一个方便的 数据库迁移工具 , 用于为 Android 中使用 Room 框架创建的数据库 提供 自动化迁移方案 ; Room Migration 数据库迁移工具用途如下 : 数据库修改.../ typeAffinity 设置列类型 */ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id", typeAffinity...= ColumnInfo.INTEGER) var id: Int = 0 /** * 姓名字段 * 数据库表中的列名为 name * 数据库表中的类型为...', age=60)] 第一行打印的日志是 Observer#onChanged 回调, List: [] , 当前数据库是空的 , 之前的数据都被清空 , 此时打印的日志都是本次应用运行时新插入的数据
在dependencies{}闭包中添加如下依赖: //room def room_version = "2.3.0" implementation "androidx.room:room-runtime...:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" 这里有两个库一个是依赖库,一个是注解处理器库...主要是注解的说明,这个@Entity就是表示数据库中的表,User类对应就是User表,@PrimaryKey表示主键,这里是id,autoGenerate = true 是自增,@NonNull表示不为空。...@ColumnInfo表示表中的列名,name = "user_name"表示列名的值。...Room是对象关系映射型数据库,所以你可以不用写这个@ColumnInfo注解,写它主要是为了设置列名,不写则使用变量名做为列名。
一、销毁 和 重建策略 在 Android 中使用 Room 操作 SQLite 数据库 , 如果 SQLite 数据库表 修改比较繁琐 , 如 : 涉及到 修改 数据库表字段的数据类型 , 需要逐个修改数据库值...1、数据库版本 3 代码示例 RoomDatabase 数据库类完整代码 package kim.hsl.rvl import android.content.Context import android.util.Log.../ typeAffinity 设置列类型 */ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id", typeAffinity...import android.util.Log import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase.../ typeAffinity 设置列类型 */ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id", typeAffinity
特性配置导入验证,非空验证,唯一验证,错误标注等 用于基础配置和普通报表的导入导出,对于复杂需求,比如公式,导出图片等暂不支持 GitHub地址: https://github.com/Mike-Zrw...SheetName sheetName不设置默认为sheet1,sheet2等 FilterColumn :导出指定列。...可根据选中的列名或者属性名导出指定的列 导入配置支持 ColumnRegexAttribute:正则判断,正则表达式判断单元格内容 ColumnRequiredAttribute:非空判断,对于不可为空的类型即使没有设置该特性...,仍会进行非空判断,所以如果一个可以为空的int类型,请设置字段类型为int?...HeaderRowIndex:列名所在行 ImportBook.DataErrorForegroundColor: 错误前景色(红) ImportBook.RepeatedErrorForegroundColor
一、Room + ViewModel + LiveData 框架使用核心要点 1、Room 框架优化分析 在上一篇博客 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库...( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 ) 中 , 实现了 使用 Room 框架访问 Android 中的 SQLite 数据库的操作...框架的用法 , 参考 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类...:room-compiler:2.2.5' 完整代码 : plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android.../ typeAffinity 设置列类型 */ @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id", typeAffinity
Room 是 SQLite 的封装,它使 Android 对数据库的操作变得非常简单,也是迄今为止我最喜欢的 Jetpack 库。...Room https://developer.android.google.cn/training/data-storage/room Room with a view codelab https://...developer.android.google.cn/codelabs/android-room-with-a-view-kotlin#0 定义数据库表 在我们的数据库中仅有一个表,就是保存词汇的表。...然后,Room 会生成一个 SQLite 表,表名和类名相同。每个类的成员对应表中的列。列名和类型与类中每个字段的名称和类型一致。...://developer.android.google.cn/codelabs/android-room-with-a-view-kotlin#0 ----
Room 也会验证方法的返回值,如果返回对象中的字段名称和查询响应中的字段名字不匹配, Room 会通过以下方式给出提示 如果只有一些字段名称不匹配,会发出警告 如果没有字段名称匹配,会发出错误。...在编译时,Room会知道是查询用户表的所有列。如果查询包含语法错误或者数据库中不存在这个表。Room会在编译时报错并给出错误信息。 将参数传递给查询 大部分时候查询都是需要过滤参数的。...Room使用参数名字匹配,如果匹配不上给出错误提示。...在迁移完成之后,Room 验证模式会确认迁移正确进行,如果 Room 发现错误,会抛出一个包含不匹配的异常。 测试迁移 数据迁移是很重要的,一旦迁移失败可能会发生Crash。...测试数据库有两种方法 在Android 设备上 在开发主机上(不推荐) 关于测试指定数据库升级的信息 上面已经说过了。 注意:在测试时,Room允许创建Dao的模拟实例。
cSumColumns 设置需要计算合计值的源Grid的列名。多列用逗号区隔。...CtotalLabelExpression 如果此属性值不为空,则在cColWithLabel属性设置的列中显示此字符串。...如果此属性值不设置,则默认使用”TOTAL”字符。在cColWithLabel属性设置的列中显示此字符串。...cColWithLabel 设置CtotalLabelExpression属性确定的标签要显示在控件的哪一列的列名称。控件各列的列名称依次为:Column1、Column2、Column3、…。...注意:字段名不能有错且均为数值型字段,字段的数据类型可为”Y”、”N”、”I”。 cSumColumns 设置要将统计出的各字段合计值显示在控件的对应列的列名。多列用逗号区隔。
2.空属性 两个值:null(默认的)和not null(不为空) 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。...第二个a(紧跟在CHANGE关键字后的两个参数中的第二个):这是修改后列的新名称(在这个特定情况下,它仍然是a,意味着列名没有改变)。...通常,CHANGE子句用于在修改列的数据类型或其他属性时同时更改列名。如果您只想更改列的数据类型或属性而不更改列名,就像您的示例中所做的那样,您需要重复列名。...这里是一个简化的解释: ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型及属性; 但在您的例子中,旧列名和新列名都是a,所以看起来就有两个a。...6.主键 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
重命名列 mgrt.rename_column(table='people',old_name='name',new_name='people_name') ) 重命名后一定记得修改数据模型中的列名...(table='people',old_name='name',new_name='people_name') # 设置(不)为空 # @@@ 因为初始的home是可以为空的,且数据库中的数据...home是空 # @@@ 所以要先给home给值,然后才能设置不为空的属性,否则会报错 mgrt.add_not_null(table='people',column='home') )...设置可为空 mgrt.drop_not_null(table='people',column='home') 重命名表名 同修改列名,修改表名后记得同步修改数据模型。...people_v2') 索引的增删 增加索引 mgrt.add_index(table='people_v2',columns='id',unique=True) ) 删除索引 # 索引名为{表名_列名
新列的类型 nullable : 新列是否可为null,可为空,当前Hudi中并未使用 comment : 新列的注释,可为空 col_position : 列添加的位置,值可为FIRST或者AFTER...column_type 新的列类型 col_comment 列comment column_name 列名,放置目标列的新位置。...Schema变更 COW MOR 说明 在最后的根级别添加一个新的可为空列 Yes Yes Yes意味着具有演进模式的写入成功并且写入之后的读取成功读取整个数据集 向内部结构添加一个新的可为空列(最后)...然而如果 upsert 触及所有基本文件,则读取将成功 添加自定义可为空的 Hudi 元列,例如 _hoodie_meta_col Yes Yes 将根级别字段的数据类型从 int 提升为 long...作为一种解决方法,您可以使该字段为空 向内部结构添加一个新的不可为空的列(最后) No No 将嵌套字段的数据类型从 long 更改为 int No No 将复杂类型的数据类型从 long 更改为
例如,在 Android 开发中,我们有 Android Framework SQLite Java API,但是开发者们通常会在项目中使用 Jetpack Room 来操作数据库。...它可以进行行迭代、获取指定列名的列号,以及 get 一些基本类型和 String 等数据,它的定义如下: interface CommonCursor { fun getInt(columnIndex...我们通过elementIndex 在该类的众多属性中查找到当前对应的属性名,再根据这个属性名查询到名称相同的列名的列号,如果列号大于等于 0 则表示列名合法,直接返回 elementIndex 即可,否则进行下一轮迭代...利用 Kotlin 的语法规则可以在很大程度上保证在编译期间暴露出我们编写的 SQL 错误,并在绝大部分情况下阻止错误的 SQL 语句代码通过编译。...:https://developer.android.com/training/data-storage/room Exposed:https://github.com/JetBrains/Exposed
数据库结构的文件 , 通过该文件 , 可以 很方便地开发者了解数据库的历史变更记录 , 方便排查问题 ; Schema 文件 定义了数据库中的表、列、索引等元素的结构 , 并包含了创建和升级数据库的..., exportSchema 参数都设置为了 false , 没有导出 Schema 文件 ; 此外 , 还要在 build.gradle 构建脚本中 配置 Schema 文件的生成位置 , 在 " android...": "$projectDir/schemas".toString() 参数 ; 完整的配置层级如下 : android { namespace 'kim.hsl.rvl' compileSdk...} return instance; } 将 Entity 实体类中 新增的字段 注释掉 ; /** * 性别字段 * 数据库表中的列名为...2 - 第二次运行应用 首先 , 设置 Entity 实体类中的字段 , 在 数据库版本 1 的基础上 , 添加 sex 字段 ; /** * 性别字段 * 数据库表中的列名为
,只能通过改了本地数据库再覆盖Android的数据库,这样操作起来非常麻烦,所以本章就是在当时的程序基础上实现了一个针对Android Sqlite数据库进行Sql操作的运维小工具。...本地的数据库操作我们还是用的Room框架,只不过网上大部分Room的教程都是类的查询,做运维时是需要自己写Sql的,所以是用了Sqlite里面对应的query和execsql这两个方法(查询和执行脚本用到...来判断 2 select开头的脚本返回Cursor后动态生成字符串后通讯到PC端 3 不是select开头的使用execsql直接执行脚本 4 通讯方式还是用前篇一样的NanoMsg 核心函数 使用Room...Cursor中有columncount和columnNames,通过这两个可以得到当前的游标返回的列数和列名。...val sb = StringBuilder() //生成对应列名 val columnqty = it.columnCount
领取专属 10元无门槛券
手把手带您无忧上云