首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android,room:自动生成的主键总是单调的吗

在Android开发中,Room是一种持久性库,用于在本地数据库中存储和访问应用程序的数据。在使用Room进行数据库操作时,自动生成的主键默认情况下不一定是单调的。

Room提供了@Entity注解用于定义数据库表,并使用@PrimaryKey注解来标识主键字段。当没有为主键字段提供值时,Room会自动生成一个唯一的主键值。生成的主键值的方式取决于所使用的主键生成策略。

Room支持三种主键生成策略:

  1. @PrimaryKey(autoGenerate = true):自动递增主键,每次插入数据时自动增加。
  2. @PrimaryKey(autoGenerate = false):手动指定主键值,不自动生成。
  3. @PrimaryKey:组合主键或使用自定义的主键生成器。

对于使用自动递增主键策略的情况,自动生成的主键值不一定是单调的。在并发环境下,多个线程同时插入数据时,由于并发操作的原因,生成的主键值可能是乱序的。因此,无法保证生成的主键值的单调性。

对于需要保持主键单调性的需求,可以考虑使用其他策略,如自定义主键生成器,通过业务逻辑来保证主键的单调增长。

至于推荐的腾讯云产品和产品介绍链接地址,根据问题的描述要求,不提及特定品牌商,故不提供相关链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑

文/朱季谦 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键很诡异,长度达到了19位,且并非是从1开始递增的—— [image.png]...底层ORM框架用的是Mybatis-Plus,我寻思了一下,这看起来像是在插入数据库旧自动生成的id,导致并非默认使用MySql的自增AUTO_INCREMENT的id。...因此,决定一步步定位,先给Mybatis-Plus打印出sql日志,看下其insert语句是否自动生成了一个id,然后才插入数据库。...mapper: debug 接下来,验证一番后,发现,Mybatis-Plus在做insert操作时,确实自动生成了一条长19的数字当做该条数据的id插入到MySql,导致虽然MySql表设置了自增...[image.png] 到这里,就确定,这个长数字的id,是在代码层次就自动生成了,最后进入对应的实体类中,发现该映射数据表的id字段,并没有显示设置对应的主键生成策略。

6K130
  • Android的room数据库使用小结(kotlin)

    "android.arch.persistence.room:compiler:1.1.1"的写法需换成kapt "android.arch.persistence.room:compiler:1.1.1...接下来最好在 app文件夹下的build.gradle中再增加项配置,让编译后自动输出生成的schemas,里面有创建和修改表结构的sql语句。...简单的使用: 第一步,在entiy包中增加实体类的定义,每个实体类对应一个表,,类前面加@Entity注解,默认类名就是最终生成的表名,如果不想让一致,可以指定表名(@Entity (tableName...使用主键 : 一个Entry中至少需要一个主键,使用@PrimaryKey来注释. 自增类型的主键,则可以设置 @PrimaryKey 的 autoGenerate 属性。...,默认的添加重复的数据(主键一致)会抛异常的。

    3.3K50

    c++类的构造函数不显式声明会自动生成吗

    构造函数默认生成规则 2.1 没有显式声明任何构造函数 编译器会自动生成默认的无参构造函数,这一点我们是可以肯定的,那另外几种构造函数也会默认生成吗,这个就不太确定了。...、赋值构造函数、移动构造函数、移动赋值构造函数,并且自动生成的构造函数都是public的,因为它们是可以用于生成对象的,而对于有参构造函数,因为参数是未知的,所以编译器没有办法自动生成。...也就是说当只声明拷贝构造函数的时候,其他构造包括普通构造都不会自动生成,而当声明了普通构造和拷贝构造时,移动构造会自动生成。 3....构造函数自动生成总结 总结一下,构造函数自动生成的规则: 没有显式声明任何构造函数时,会自动生成普通构造函数、拷贝构造函数、赋值构造函数、移动构造函数、移动赋值构造函数五种; 对于带普通参数的构造函数,...显示声明普通构造函数和拷贝构造函数时,会自动生成移动构造函数; 这些构造函数不要求总是全部显式声明,但我们在使用class的时候最好显式声明这五种构造函数,避免出现一些不必要的问题。

    1.2K20

    AAC---Room使用

    Room Database ObjectBox是非SQLite的ORM数据库框架,它自定义了自己的数据库文件,它的文件只有官方提供的工具才能打开,并且对于外键、主键等支持也比较完备,并且效率比Room..."android.arch.persistence.room:runtime:$room_version" annotationProcessor "android.arch.persistence.room..."android.arch.persistence.room:testing:$room_version" } 定义数据库 使用entities定义在数据库中存储的实体结构 使用version定义数据库版本...每个Entity需要定义至少一个PrimaryKey,也可以通过一个integer类型的Id定义@PrimaryKey(autoGenerate = true)自动生成Id 为了提升查询的速度,可以通过...在编译完成后,如果没有问题,则会在/app/build/generated/source/apt/debug/pkg/下生成dao_IMPL类,以及数据库相应的包名下生成database_IMPL的类

    1.4K20

    【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 )

    ; plugins { id 'com.android.application' } 如果使用 Kotlin 语言开发 , 需要在 android 插件 的基础上 额外导入 kotlin 和...annotationProcessor 'androidx.room:room-compiler:2.2.5' 如果使用 Kotlin 语言开发 , 需要使用 kapt 导入注解处理器 , 用于在编译期间生成代码...参数 , 该 tableName 参数的作用是定义数据库表的名称 ; @Entity(tableName = "student") class Student { } @PrimaryKey 注解 定义主键..., 使用 @PrimaryKey 注解修饰主键 , 设置 autoGenerate = true 参数 可以令 主键自增 ; 数据库表 列信息 使用 @ColumnInfo 注解定义 , 该注解中的参数...' id 'kotlin-kapt' 导入 Room 依赖库 和 编译时生成代码的 注解处理器 ; // 导入 Room 依赖库 implementation 'androidx.room

    48130

    Jetpack组件之Room

    优势 拥有SQLite的所有操作功能。 使用简单,通过注解的方式实现相关功能,编译时自动生成实现类impl。 与LiveData、LifeCycle及Paging天然支持。...,必须要有,且不为空,autoGenerate 主键的值是否由Room自动生成,默认false @PrimaryKey(autoGenerate = true) @ColumnInfo(...每个Entity至少有一个字段作为主键,如果想让数据库为字段自动分配ID,可以使用autoGenerate,如果Entity想有符合主键,可以使用@Entity注解里的primaryKeys,设置复合主键...但是,您必须在每次使用这些注解时添加 @CopyAnnotations 注解,以便 Room 可以正确解释这些方法的自动生成实现。...与LiveData和ViewModel的结合 当Room数据库中的数据发生变化时 ,能够通过LiveData组件通知View层,实现数据的自动更新。

    1.9K20

    【Jetpack】Room 预填充数据 ( 安装 DB Browser for SQLite 工具 | 创建数据库文件 | 应用中设预填充数据对应的数据库文件 | 预填充数据库表字段属性必须一致 )

    一、Room 预填充数据简介 在 Android 中使用 Room 框架 , 创建 SQLite 数据库时 , 有时需要预填充一些数据 , 这些数据一般都是来自 assets 资源目录 ; 如果用户首次打开应用...不变 , 将该字段设置为 非空 / 自增 / 主键 ; 生成的 SQL 语句如下 : CREATE TABLE "" ( "id" INTEGER NOT NULL, PRIMARY KEY("id...assets 目录下自动读取 db 数据库文件中的数据 , 并将数据初始化本应用的数据库表中 ; /** * 配置Room以使用位于的预打包数据库创建和打开数据库 * 应用程序“assets/”文件夹...createFromAsset 函数 , 就可以自动从 assets 目录下自动读取 db 数据库文件中的数据 , 并将数据初始化本应用的数据库表中 ; package kim.hsl.rvl import...android.content.Context import android.util.Log import androidx.room.Database import androidx.room.Room

    60820

    JetPack--Room数据库

    将忽略它,属性也可以使用这个注解,表示这个属性将不会生成数据库字段 使用@PrimaryKey注解指定主键并且是自增长的 属性还可以指定在数据库的字段等,使用@ColumnInfo注解: package...表进行操作,对接口使用@Dao注解 @Query、@Insert、@Delete、@Update注解,分别表示:查询、新增、删除、更新 增删改操作内部会自动使用主键进行操作 package com.aruba.room...、数据库版本、是否输出日志 使用单例模式时,构造方法不能私有化,因为Room内部会调用构造方法 定义获取Dao对象的抽象函数 package com.aruba.room; import android.content.Context...效果: 不过每次我们做了操作后,还需要手动查询下,有没有可以自动刷新数据的方法呢?...package com.aruba.room; import android.content.Context; import android.os.AsyncTask; import android.view.View

    1.5K20

    【Jetpack】ORM 数据库访问框架 Room 简介 ( 对象关系映射 ORM 概念简介 | Room 框架的组成部分 - 实体、数据库访问对象、数据库持有者 | Room 框架使用步骤 )

    一、对象关系映射 - ORM / Object Relational Mapping ---- Android 系统中使用的数据库是 SQLite 关系型数据库 , 使用 Android 提供的 api..., Entity 实体类 , 三者之间的关系如下 : 首先 , 在 Android 应用中 , 通过 Room 框架的 Database 拿到 数据库持有者 对象 ; 然后 , 通过 数据库持有者 Database..."androidx.room:room-runtime:$room_version" // 编译时依赖项 在编译时实时生成 Room 代码 如 : Dao 实现类 / AppDatabase...Query 注解:用于标记 DAO 接口中的方法,并指定 SQL 查询语句。 PrimaryKey 注解:用于指定实体类中的主键字段。...androidx.room:room-compiler 依赖库 是 Room 持久化库中的一个 编译时依赖项 , 用于 在编译时生成 Room 的如下实现代码 : AppDatabase 的子类 , 用于创建和访问数据库

    1.7K20

    Android Room数据库使用

    增删改查 四、源码 前言   Room数据库是Google的JitPack组件中的一个,推出已经有一段时间了,现在的使用者也越来越多,Room是一个轻量级的ORM(Object Relational Mapping...Room其实和Retrofit差不多,Room在开发阶段通过注解的方式标记相关功能,编译时自动生成响应的impl实现类。...,这个@Entity就是表示数据库中的表,User类对应就是User表,@PrimaryKey表示主键,这里是id,autoGenerate = true 是自增,@NonNull表示不为空。...param user 根据用户进行删除 */ @Delete void delete(User user); } UserDao是一个接口,主要是定义了一些方法,通过注解在编译的时候会生成实现类...可以查看到,MyDatabase和UserDao的实现类都自动生成了。 三、表操作   表操作无非就是那么几个,增删改查,但是为了更直观的显示结果,需要对UI做一些改动。

    1.3K30

    Android Room数据库使用

    前言   Room数据库是Google的JitPack组件中的一个,推出已经有一段时间了,现在的使用者也越来越多,Room是一个轻量级的ORM(Object Relational Mapping:对象关系映射...Room其实和Retrofit差不多,Room在开发阶段通过注解的方式标记相关功能,编译时自动生成响应的impl实现类。...2.3.0表示room最新的依赖库版本。 点击Sync进行同步一下。...,这个@Entity就是表示数据库中的表,User类对应就是User表,@PrimaryKey表示主键,这里是id,autoGenerate = true 是自增,@NonNull表示不为空。...可以查看到,MyDatabase和UserDao的实现类都自动生成了。 三、表操作   表操作无非就是那么几个,增删改查,但是为了更直观的显示结果,需要对UI做一些改动。

    72420

    【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

    一、Room + ViewModel + LiveData 框架使用核心要点 1、Room 框架优化分析 在上一篇博客 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库...( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 ) 中 , 实现了 使用 Room 框架访问 Android 中的 SQLite 数据库的操作...fun query(id: Int): List Room 框架的用法 , 参考 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 (...2.2.5' } 2、Room 框架相关代码 Entity 实体类 Entity 实体类 使用 @Entity 注解修饰 , 并使用 @PrimaryKey 注解修饰主键 , 使用 @ColumnInfo...通过调用 ViewModel 视图模型 , 访问 Room 数据库框架 , 对数据进行增删改查 , 并通过 LiveData 监听数据库中的数据 , 如果数据库中的数据发生改变 , 自动回调 LiveData

    1K20

    Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    ---- 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Architecture Components...表的搭建 Room 作为一个 Android 数据库操作的注解集合,最基本操作就是对我们数据库进行的。...) 我们再往下看: @ColumnInfo(name = “userid”) :该注解注解的数据成员,将会在表中生成相应的名为:userid 的列 @PrimaryKey :顾名思义该注解与@ColumnInfo...我们再仔细观察就会发想,上方的构造方法标记了 @Ignore 标签,而下方的构造方法却没有。由于在 @Entity 标注的类中,构造方法和列属性的 get() 方法都会被注解处理器自动识别处理。...所以我们就有了这个被 @Ignore 的构造方法,用于创建不被自动存入数据库的临时对象,等到我们想将这个对象存入数据库时,调用User(String id, String userName) 即可。

    1.2K20
    领券