相关文章推荐
温柔的墨镜  ·  非参数回归的贝叶斯估计·  1 月前    · 
很拉风的鼠标垫  ·  《地球最后的夜晚》:艺术电影的曙光还是至暗时 ...·  2 月前    · 
精明的饺子  ·  Translation of 抛砖引玉 ...·  2 月前    · 
追风的野马  ·  姜维-信息工程学院·  2 月前    · 
任性的蚂蚁  ·  亞斯伯格成人量表·  2 月前    · 
小百科  ›  SQLite---使用约束开发者社区
access 软件 sqlite
善良的稀饭
2 年前
作者头像
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
 
推荐文章
温柔的墨镜  ·  非参数回归的贝叶斯估计
1 月前
很拉风的鼠标垫  ·  《地球最后的夜晚》:艺术电影的曙光还是至暗时刻--传媒--人民网
2 月前
精明的饺子  ·  Translation of 抛砖引玉 to English with audio for 抛砖引玉 -Chinese ...
2 月前
追风的野马  ·  姜维-信息工程学院
2 月前
任性的蚂蚁  ·  亞斯伯格成人量表
2 月前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南