SQLiteMisuseException:插入行时出现错误代码21

时间:2012-03-13 14:07:15

标签: android sqlite

插入行时,我有时会收到SQLiteMisuseException。应用程序在数百个设备上完美运行,但在Android 3.1上有一个SQLite异常。 堆栈跟踪:

    android.database.sqlite.SQLiteMisuseException: error code 21: not an error
    at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)

这是一个调用executeInsert()的代码:

    final SQLiteStatement insUrlStmt = db.compileStatement("insert into urls (url,idx) values (?,?)");
    insUrlStmt.bindString(1, url)
    insUrlStmt.bindLong(2, idx);
    return insUrlStmt.executeInsert();

db字段声明:

    private final SQLiteDatabase db;

db字段的初始化(这在Application类对象的onCreate()中调用一次),对DataHelper的引用静态存储在应用程序实例中:

    public DataHelper(Context context) {db = new OpenHelper(context).getWritableDatabase();   }

OpenHelper构造函数:

    protected OpenHelper(Context context) 
{
     super(context, "database.db", null, 1);       
}

我已经阅读了这个问题:Android SQLite error code 21并搜索了那里提到的内容。

SQLiteDatabase(db字段)只打开一次,它永远不会直接从应用程序代码中关闭。多线程访问应该不是问题,因为executeInsert()方法中的第一件事是锁定数据库(我在android 2.1的源代码中检查过,所以我假设这种行为在3.1中没有改变)。

2 个答案:

答案 0 :(得分:0)

尝试使用ContentValues插入记录。

例如:

ContentValues cv = new ContentValues();
cv.put("column1Name", column1Value);
cv.put("column2Name", column2Value);//and so on
db.insert(TABLE_NAME, null, cv);

答案 1 :(得分:0)

检查你的sql语句 - 它可能是null或零长度。从类中获取sql语句时我遇到了同样的问题,每当找到新行字符时我都要分解它。最后一个语句包含一个换行符,我尝试在该语句为空之后执行该语句。