用户尝试在数据库中插入重复值时捕获错误 - greenDAO

时间:2014-02-24 15:43:22

标签: android sqlite orm greendao

我使用greenDAO生成我的DAO类,一切正常,直到我尝试为主键插入重复值。

当我尝试插入重复的primery密钥(如预期的那样)时失败,但我想将异常发送给用户,而不是随应用程序爆炸。

现在唯一的解决方案是,我认为它不是最好的,是在插入之前进行查询,并检查结果计数是否大于0。

有更好的方法吗?

方法.insert返回一个Long值,但是当它无法插入时它不会返回任何内容,只是随应用程序爆炸。

3 个答案:

答案 0 :(得分:1)

最好是将主键增量远离用户提供的密钥。然而,这是我个人的选择,但是当我必须检查最后插入的ID时,我会做出类似的事情:

public int getPrimaryId() {
        final String MY_QUERY = "SELECT MAX(_id) FROM " + DATABASE_TABLE0;
        Cursor cur = mDb.rawQuery(MY_QUERY, null);
        cur.moveToFirst();
        int ID = cur.getInt(0);
        cur.close();
        return ID;
    }

在您的情况下,一旦用户提供新密钥,您可以使用primaryID预加载数组列表,只需使用arraylist中的元素进行检查即可。更快!

更新:检查ID是否存在。

SELECT EXISTS(SELECT 1 FROM myTbl WHERE ID="anyID" LIMIT 1);

LIMIT将确保一旦发现就没有必要更进一步。这将超级快。 Plus Exists将始终返回结果。

还建议使用适当的indexes

答案 1 :(得分:1)

使用try-catch-block

包围insert语句
try {
    dao.insert (entity);
} catch (Exception ex) {
    // Do your handling here
} catch (Error e) {
    // and here
}

答案 2 :(得分:0)

我认为这将是控制它的另一种方式,但我没有做这个SELECT就找到了方法。 这有两个解决方案:

  1. 使用SELECT
  2. 使用SELECT(在此帖子上由其他用户提出 - 查看更多详细信息)

    public int getPrimaryId() {
            final String MY_QUERY = "SELECT MAX(_id) FROM " + DATABASE_TABLE0;
            Cursor cur = mDb.rawQuery(MY_QUERY, null);
            cur.moveToFirst();
            int ID = cur.getInt(0);
            cur.close();
            return ID;
        }
    
    1. 覆盖方法

      在myObjectDAO.java

    2. 中覆盖.insert()方法
      @Override
        public long insert(Stud_Course entity) {
            long ret = 0;
            try {
                ret = super.insert(entity);
            } catch (Exception e) {
                ret = 0;
                Log.e("LOG", "fail to insert!!!");
            }
            return ret;
        }