Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当用户试图在数据库中插入重复值时捕获错误-greenDAO_Android_Sqlite_Orm_Greendao - Fatal编程技术网

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

Android 当用户试图在数据库中插入重复值时捕获错误-greenDAO,android,sqlite,orm,greendao,Android,Sqlite,Orm,Greendao,我使用greenDAO生成我的DAO类,在我尝试为主键插入重复的值之前,一切都正常 当我尝试插入重复的primery密钥(如预期的那样)时,它失败了,但我希望将异常发送给用户,而不是与应用程序一起爆炸 目前,我唯一的解决方案(我认为这不是最好的)是在插入之前进行查询,并检查结果计数是否大于0 有更好的方法吗 insert方法返回一个长值,但如果插入失败,它不会返回任何内容,只会随着应用程序爆炸。最好是让主键增量远离用户作为键提供的内容。然而,这是我个人的选择,但当我必须检查最后插入的ID时,我会

我使用greenDAO生成我的DAO类,在我尝试为主键插入重复的值之前,一切都正常

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

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

有更好的方法吗


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将始终返回一个结果


还建议使用适当的

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

  • 选择
  • 使用SELECT(此帖子上的其他用户建议-查看更多详细信息)

  • 覆盖方法

    在myObjectDAO.java中重写.insert()方法


  • 用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
    }