Иногда я получаю 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 (это вызывается один раз в onCreate () объекта класса Application), а ссылка на DataHelper хранится статически в экземпляре приложения:
public DataHelper(Context context) {db = new OpenHelper(context).getWritableDatabase(); }
Конструктор OpenHelper:
protected OpenHelper(Context context)
{
super(context, "database.db", null, 1);
}
Я уже читал этот вопрос: Код ошибки Android SQLite 21 и искал вещи, упомянутые там.
SQLiteDatabase (поле базы данных) открывается только один раз и никогда не закрывается непосредственно из кода приложения. Многопоточный доступ не должен быть проблемой, потому что первым делом в методе executeInsert () является блокировка базы данных (я проверил исходный код Android 2.1, поэтому я предполагаю, что это поведение не изменилось в 3.1).