插入行时,我有时会收到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中没有改变)。
答案 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语句时我遇到了同样的问题,每当找到新行字符时我都要分解它。最后一个语句包含一个换行符,我尝试在该语句为空之后执行该语句。