SQLiteMisuseException: код ошибки 21 при вставке строки - PullRequest
1 голос
/ 13 марта 2012

Иногда я получаю 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).

Ответы [ 2 ]

0 голосов
/ 18 февраля 2016

Проверьте ваши операторы sql - это может быть ноль или нулевая длина.У меня была та же проблема, когда я получал операторы sql из класса, который мне приходилось ломать всякий раз, когда был найден символ новой строки.Последний оператор содержал символ новой строки, и я пытался выполнить этот оператор после того, который был пустым.

0 голосов
/ 24 апреля 2012

попробуйте использовать ContentValues для вставки записи.

Например:

ContentValues cv = new ContentValues();
cv.put("column1Name", column1Value);
cv.put("column2Name", column2Value);//and so on
db.insert(TABLE_NAME, null, cv);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...