【问题标题】:Intermittent SQLiteException: not an error at dbopen间歇性 SQLiteException:不是 dbopen 的错误
【发布时间】:2012-05-15 06:12:16
【问题描述】:

在我的应用程序中,我在许多情况下都使用 DB,但在一种情况下,我遇到异常,不是每次都可以重现它(目前)。

这仅在操作系统版本 2.3.7 和 2.1-update-1 上发生。

代码:

public void removeOldOccurrences() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Long oldTime = System.currentTimeMillis() - VALID_OCCURRENCE_TIME;
        String query = "";
        try {
            query = "DELETE FROM " + LOCATIONS_TABLE + " WHERE not ("
                    + REMEMBERED_FIELD + "=1) " + "and (" + LAST_FIELD + "<"
                    + oldTime + ");";
            db.execSQL(query);
        } catch (Exception e) {
            Log.e(TAG, query);
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.close();
            }
        }
    }

异常跟踪是:

android.database.sqlite.SQLiteException: not an error
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:573)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)

请帮忙。

【问题讨论】:

    标签: android sqlite exception getwritabledatabase


    【解决方案1】:

    确保您的查询不包含分号“;”后面的空行您的查询

    我在 Sqlite 客户端中执行查询时遇到了同样的问题,在四处寻找之后我发现问题是我在查询下方有两个空行。

    如果有人遇到同样的问题,这里有一些 Sqlite 客户端中的通过/失败案例(或加载 .sql 文件)。

    好:

    -- test.sql
    SELECT * FROM table;
    

    好:

    -- test2.sql
    -- notice the empty line below doesn't break the code
    
    SELECT * FROM table;
    

    好:

    -- test3.sql
    -- notice the query string is not terminated by semicolon ";"
    -- but it does contain trailing empty lines
    SELECT * FROM table
    
    
    -- this line is just a placeholder, in actual file this line should also be empty
    

    不好:

    -- test3.sql
    -- notice the query string is terminated with semicolon, 
    -- and there are trailing empty lines after that
    SELECT * FROM table;
    
    
    -- this line is just a placeholder, in actual file this line should also be empty
    

    希望这会有所帮助。

    【讨论】:

    • 很好,这对我有帮助。
    【解决方案2】:

    在传递空字符串进行查询时,我也收到了同样的错误。

    【讨论】:

    • 就我而言,我只有空格,技术上不是空的,但结果相同
    【解决方案3】:

    我花了两个小时寻找这个问题的解决方案,这就是我无法在 SQLite 数据库中创建表的原因。

    我的错误是我有“is_selected”属性,这导致了 NOT AN ERROR 错误。重命名属性并且它起作用了。

    【讨论】:

      【解决方案4】:

      此错误来自您尝试创建/打开数据库的语句 getWritableDatabase。

      从您给出的代码段中,我看到您正在尝试为每个操作打开数据库。

      这不是正确的做法。在您关闭它之前,您只需打开您的数据库一次。通常的做法是在其他初始化期间打开它,并注意在退出应用程序之前将其关闭。一旦打开存储数据库上下文并在所有其他操作中使用它

      例如:你可以有一个这样的数据库管理类:

      public DataBaseManager open() throws SQLException {
          try {
              mDbHelper = new DatabaseHelper(mCtx);
              mDb = mDbHelper.getWritableDatabase();
      
          } catch (Exception ex) {
              ex.printStackTrace();
              Utils.getHomeActivityinstance().finish();
      
          }
          return this;
      }
      

      现在需要调用 delte 时,不要再调用 open

      public boolean deleteRow(String tableName, long rowId) {
      
          return mDb.delete(tableName, ID + "=" + rowId, null) > 0;
      }
      

      【讨论】:

      • 感谢您的回答,我知道这不是使用 DB 的有效方式,但我不明白您的解决方案在执行 getWritableDatabase() 时不会让我遇到相同异常的原因。正如我所提到的,我只在 2.3.7 和 2.1-update-1 上看到了这个异常,而不是每次都看到。
      • 一个可能的问题是“打开一个已经打开的数据库”。我的设计不会出现这个问题
      【解决方案5】:

      您在not 上的查询似乎不正确。

      看看SQLite Docs,根据他们的说法,您尝试使用它的方式没有not(作为对您位置的否定)。

      您的选择似乎不是:

      NOT LIKE
      NOT GLOB
      NOT REGEXP
      NOT MATCH
      NOT BETWEEN
      NOT IN
      IS NOT
      

      其中大多数都需要在它们之前使用表达式。

      WHERE xxxx NOT MATCH yyyy
      

      【讨论】:

      • 嘿,谢谢您的回答。我不认为这是真的,原因有两个: 1. 除了这几种情况(大多数都在 2.3.7 上)之外,每次都会成功相同的查询。 2.在您链接的同一文档中写道:“这些是一元前缀运算符:- + ~ NOT”。除此之外,当 preetha 说我在 getWritableDatabase() 方法中遇到异常时,他说并且正在写。
      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 2012-08-11
      相关资源
      最近更新 更多