9.4.2. 数据库约束

优质
小牛编辑
124浏览
2023-12-01

9.4.2.数据库约束

再次运行这个Service,你会发现它执行失败,而在logcat中得到许多SQLException。而这都是数据库约束(database constraint)抛出的异常。

这是因为我们插入了重复的ID。前面从服务端抓取消息数据时,获得了消息的ID字段,并作为主键一并插入本地数据库。但是我们每分钟都会通过getFriendsTimeline()重新抓取最近24小时的20条消息,因此除非你的朋友在一个分钟里发了超过20条消息,那么插入的_id就肯定会发生重复。而_id作为主键,又是不允许重复的。这样在插入数据时,就违反了数据库的约束,于是抛出SQLException。

因此在插入时,应首先检查是否存在重复数据,但我们不想在代码中添加额外的逻辑,数据库的事情交给数据库解决就足够了。解决方案是:原样插入,然后忽略可能发生的异常就可以了。

为此,我们把db.insert()改成db.insertOrThrow(),然后捕获并忽略SQLException。

...

try {

db.insertOrThrow(DbHelper.TABLE, null, values); //①

Log.d(TAG, String.format("%s: %s", status.user.name, status.text));

} catch (SQLException e) { //②

// Ignore exception

}

...

当插入操作失败时,代码会抛出异常。

  1. 捕获这一异常,并简单忽略。这将留在后面一节做进一步改进。
  2. 到这里代码已经能够正常工作,但仍不够理想。重构的机会又来了。