Android 当用户试图在数据库中插入重复值时捕获错误-greenDAO
我使用greenDAO生成我的DAO类,在我尝试为主键插入重复的值之前,一切都正常 当我尝试插入重复的primery密钥(如预期的那样)时,它失败了,但我希望将异常发送给用户,而不是与应用程序一起爆炸 目前,我唯一的解决方案(我认为这不是最好的)是在插入之前进行查询,并检查结果计数是否大于0 有更好的方法吗Android 当用户试图在数据库中插入重复值时捕获错误-greenDAO,android,sqlite,orm,greendao,Android,Sqlite,Orm,Greendao,我使用greenDAO生成我的DAO类,在我尝试为主键插入重复的值之前,一切都正常 当我尝试插入重复的primery密钥(如预期的那样)时,它失败了,但我希望将异常发送给用户,而不是与应用程序一起爆炸 目前,我唯一的解决方案(我认为这不是最好的)是在插入之前进行查询,并检查结果计数是否大于0 有更好的方法吗 insert方法返回一个长值,但如果插入失败,它不会返回任何内容,只会随着应用程序爆炸。最好是让主键增量远离用户作为键提供的内容。然而,这是我个人的选择,但当我必须检查最后插入的ID时,我会
insert方法返回一个长值,但如果插入失败,它不会返回任何内容,只会随着应用程序爆炸。最好是让主键增量远离用户作为键提供的内容。然而,这是我个人的选择,但当我必须检查最后插入的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是否存在。
该限额将确保一旦发现,无需再进一步。这会非常快。Plus Exists将始终返回一个结果
还建议使用适当的我认为这是另一种控制它的方法,但我没有做这个选择就找到了我的方法。 以下是两种解决方案:
用try-catch块环绕insert语句
try {
dao.insert (entity);
} catch (Exception ex) {
// Do your handling here
} catch (Error e) {
// and here
}
您的主键是增量的吗?不,我只是想捕捉错误,通知用户我理解您的观点,但我想知道的是,是否有其他方法可以做到这一点,而不必进行选择。我想知道是否有可能简单地捕获错误并处理它,而不是在应用程序中爆炸。要将现有ID与用户提供的ID进行匹配,我认为唯一的方法是使用Select查询。但是,如果你使用Where子句,事情会变得更快。这是一个解决方案,但我认为这不是一个好方法。假设你有一对密钥(字段a、字段B、字段C),这三个字段必须是唯一的组合。greenDAO允许您实现一个索引,以确保该索引是唯一的。如果我要在用户端控制这个索引(编程,就像您的解决方案),为什么我需要在greenDAO端创建它?为什么我要在sqlite上创建索引?您不必在用户端管理索引,这就是为什么我的第一个问题是您使用的是增量PrimaryKey。您的场景可能会有所不同,不过。我确实重写了.insert()方法,而且它的工作方式也很理想。虽然我认为它应该由greenDAO生成器实现。谢谢你不应该重写生成的方法。您的修改将在重新生成时丢失,即当您的架构被修改/扩展时。把试抓放到外面。你真的在用主键吗?
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;
}
@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;
}
try {
dao.insert (entity);
} catch (Exception ex) {
// Do your handling here
} catch (Error e) {
// and here
}