我使用greenDAO生成我的DAO类,一切正常,直到我尝试为主键插入重复值。
当我尝试插入重复的primery密钥(如预期的那样)时失败,但我想将异常发送给用户,而不是随应用程序爆炸。
现在唯一的解决方案是,我认为它不是最好的,是在插入之前进行查询,并检查结果计数是否大于0。
有更好的方法吗?
方法.insert返回一个Long值,但是当它无法插入时它不会返回任何内容,只是随应用程序爆炸。
答案 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中的元素进行检查即可。更快!
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就找到了方法。 这有两个解决方案:
使用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;
}
覆盖方法
在myObjectDAO.java
@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; }