相关文章推荐
坏坏的仙人掌  ·  细讲sklearn决策树后剪枝(带例子)_s ...·  1 年前    · 
好帅的砖头  ·  填坑:Eureka ...·  1 年前    · 
私奔的佛珠  ·  react重要基础概念---06应用:Tab ...·  1 年前    · 
时尚的豌豆  ·  时序数据深度学习笔记——ARLSTM_lst ...·  2 年前    · 
会搭讪的石榴  ·  24个经典的MySQL索引问题,你都遇到过哪 ...·  2 年前    · 
Code  ›  SQLite---使用约束开发者社区
access 软件 sqlite
https://cloud.tencent.com/developer/article/1369194
善良的稀饭
1 年前
作者头像
None_Ling
0 篇文章

SQLite---使用约束

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Android相关 > SQLite---使用约束

SQLite---使用约束

作者头像
None_Ling
发布 于 2018-12-06 15:46:29
1K 0
发布 于 2018-12-06 15:46:29
举报

背景

在使用SQLite建表的时候,通常会使用 _id 作为唯一标示,使用 PRIMARY KEY 与 AUTOCREMENT 进行修饰,而主键是不可以重复的。但是在这张表中还有其他的Column也不允许重复,则可以使用Unique约束。

常用的约束有:

  • Unique:确保该列中的所有值是不同的
  • Not Null:确保被该约束修饰的列不会有空值
  • Default:当该字段没有值时,使用默认值填充
  • Primary Key:确保该列可以唯一标示一条数据,不会重复
  • Check:确保该列的值都满足条件,如果不满足,则无法插入

举例

现在有一张表,记录了本设备最近使用的App历史记录,并且按照进入的时间进行排序显示。当同一个App重复进入的时候,则需要覆盖原有Row。

那么这张表拥有四列:

  • _id :自增标志ID
  • app_name :访问的APP名,必须唯一
  • access_time :访问时间
  • access_count :访问次数,检测值必须大于0次

步骤

  • 在建表时,为唯一列设置 Unique 属性
  • 在建表时,加入 Conflict 处理策略
  • 在插入时,决定 Conflict 处理策略

注意:无论是建表时决定Conflict的处理策略还是插入时决定处理策略, Unique 属性都是必须的

建表实现

创建 app_access_table 表,其中:

  • _id :使用 Primary Key 约束,自增
  • app_name :使用 Unique ,当有冲突时,则替换该条
  • access_time :使用 Default 约束,默认值为10000
  • aacess_count :使用 Check 约束,检查是否大于0
CREATE TABLE IF NOT EXISTS app_access_table (
      _id INTEGER PRIMARY KEY AUTOINCREMENT ,
      app_name TEXT UNIQUE ON CONFLICT REPLACE ,
      access_time LONG DEFAULT 10000 ,
      access_count INTEGER CHECK(access_count>0)
)

该建表语句决定了,当有新数据插入时,如果有相同 app_name 的话,则使用 Replace 策略替换原有数据

插入实现

创建 app_access_table 表,其中:

  • _id :主键,自增
  • app_name :只有 Unique 约束
  • access_time :默认值为10000
CREATE TABLE IF NOT EXISTS app_access_table (
      _id INTEGER PRIMARY KEY AUTOINCREMENT ,
      app_name TEXT UNIQUE ,
      access_time LONG DEFAULT 10000 ,
      access_count INTEGER CHECK(access_count>0)
)

在数据插入时使用 insertWithOnConflict 来决定冲突时,该如何处理,此处使用 SQLiteDatabase.CONFLICT_REPLACE 来决定数据冲突时,替换该条数据

db.insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE);

值得注意的是,SQLiteDatabase在面对Replace的处理是,首先删除原有的行,然后再把新的这一行添加到表中,替换完后, _id 字段会发生变化。

其他处理策略:

  • CONFLICT_ROLLBACK =1 当冲突发生时,立即回滚,结束当前的Transaction,并且会返回 SQLITE_CONSTRAINT 错误码。如果没有Transaction的话,那么就和 ABORT 一样
  • CONFLICT_ABORT = 2 当冲突发生时,不会执行Rollback,而会保留之前的数据。这是默认行为
  • CONFLICT_FAIL =3
 
推荐文章
坏坏的仙人掌  ·  细讲sklearn决策树后剪枝(带例子)_sklearn决策树剪枝_老饼讲解机器学习的博客-CSDN博客
1 年前
好帅的砖头  ·  填坑:Eureka java.net.UnknownHostException: xxxxxxxx_catoop的技术博客_51CTO博客
1 年前
私奔的佛珠  ·  react重要基础概念---06应用:Tabs组件 - 掘金
1 年前
时尚的豌豆  ·  时序数据深度学习笔记——ARLSTM_lstm自回归_HughYue1990的博客-CSDN博客
2 年前
会搭讪的石榴  ·  24个经典的MySQL索引问题,你都遇到过哪些?-阿里云开发者社区
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号