相关文章推荐
坏坏的猴子  ·  sqlite ...·  4 月前    · 
刚失恋的蚂蚁  ·  sql - Fastest Way ...·  4 月前    · 
飞奔的苦咖啡  ·  .NET MAUI 本機資料庫 - ...·  4 月前    · 
奋斗的炒饭  ·  上海交通大学上海高级金融学院中科创客-复合型 ...·  9 月前    · 
瘦瘦的青蛙  ·  購買 F1® 23 - ...·  9 月前    · 
儒雅的针织衫  ·  生鲜电商生死局:模式各有千秋,巨头强势入场, ...·  2 年前    · 
善良的拐杖  ·  《红楼梦》里诗词很多,这首联句诗考生最要注意 ...·  2 年前    · 
活泼的太阳  ·  德伯力克女主角伊娃_德伯力克的女主是谁_德伯 ...·  2 年前    · 
Code  ›  SQLite---使用约束开发者社区
access 软件 sqlite
https://cloud.tencent.com/developer/article/1369194
善良的稀饭
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
 
推荐文章
坏坏的猴子  ·  sqlite 合并两个数据库中的特定表_sqlite数据库合并
4 月前
刚失恋的蚂蚁  ·  sql - Fastest Way merge two SQLITE Databases - Stack Overflow
4 月前
飞奔的苦咖啡  ·  .NET MAUI 本機資料庫 - .NET MAUI | Microsoft Learn
4 月前
奋斗的炒饭  ·  上海交通大学上海高级金融学院中科创客-复合型科技产业领军人才培养计划课程
9 月前
瘦瘦的青蛙  ·  購買 F1® 23 - Electronic Arts
9 月前
儒雅的针织衫  ·  生鲜电商生死局:模式各有千秋,巨头强势入场,盈利难题仍待解 - 21财经
2 年前
善良的拐杖  ·  《红楼梦》里诗词很多,这首联句诗考生最要注意_读书_澎湃新闻-The Paper
2 年前
活泼的太阳  ·  德伯力克女主角伊娃_德伯力克的女主是谁_德伯力克2022意大利 - 抖音
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号