SQLiteConstraintException在androidMediaProvider数据库中的分析

来源:互联网 发布:松江云安消防主机编程 编辑:程序博客网 时间:2024/06/05 22:42

我们首先来看下framework中对于SQLiteConstraintException的描述


/** * An exception that indicates that an integrity constraint was violated. */public class SQLiteConstraintException extends SQLiteException {    public SQLiteConstraintException() {}    public SQLiteConstraintException(String error) {        super(error);    }}

An exception that indicates that an integrity constraint was violated:一个异常表现为一个完整的约束条件被侵犯了。

这样的异常会在2中情况下抛出:

1:你定义的字段为 not null而插入时对应的字段却没值。

2:你定义的字段设定PRIMARY,而插入的值已经在表中存在。


最近在测试文件管理apk时遇到第二种情况,对于文件的操作,重命名,删除,复制等;

都是需要将改动update到com.android.providers.media下的external.db的file表中。

假设sdcard下存在a和b 文件,直接将b文件重命名为a文件,是不可行的,一般的做法是listfiles()方法来遍历此路径的上一级根目录的文件列表来查询是否有相同项。

当然,最保险的做法是遍历数据库,但是那样就太夸张了,需要对比的数据量太大了。


测试使用的是图片数据库,文件数据库的信息量太大了,不好作为示范:






那么这时候我们查看数据库




如果使用了adb命令删除a文件,这时候将会出现a文件以及实际上被删除,但是数据库中数据未更新。

再将b文件重命名为a.就会抛出 SQLiteConstraintException异常。

目前的解决方法只是catch(SQLiteConstraintException e),尚未有更好的解决方案。

0 0
原创粉丝点击