Большой двоичный объект Android SQL

#android #database #sqlite #blob #android-contentprovider

#Android #База данных #sqlite #большой двоичный объект #android-contentprovider

Вопрос:

Я пытаюсь сохранить и массив байтов (byte[]) в БД. У меня есть массив байтов, поставщик контента и база данных. Когда я пытаюсь вставить в большой двоичный объект, вставка возвращает значение -1. Может кто-нибудь показать мне, как это сделать.

Вставить

 byte[] inData = nw.receive();
ContentValues values = new ContentValues();
values.put(InDatabase.Columns.DATA, inData);
values.put(InDatabase.Columns.SIZE, inData.length);
NetService.this.getContentResolver().insert(InContentProvider.CONTENT_URI, values);
  

Поставщик контента

 mDB = mDBHelper.getWritableDatabase();
Long rowId = mDB.insert(mDBHelper.tableName(), null, aValues);
  

База данных

@Переопределить
public void onCreate(база данных SQLiteDatabase db) {
db.ExecSQL("СОЗДАТЬ таблицу "   ИМЯ_ТАБЛИЦЫ   "(АВТОИНКРЕМЕНТ ПЕРВИЧНОГО КЛЮЧА С ЦЕЛЫМ ЧИСЛОМ ИДЕНТИФИКАТОРОВ, БОЛЬШОЙ ДВОИЧНЫЙ ОБЪЕКТ данных, ЦЕЛОЧИСЛЕННЫЙ размер);");
}

Как я уже сказал, если я не ставлю values.put(InDatabase.Columns.DATA, inData) , это работает идеально.

Ответ №1:

Итак, реализация была правильной, проблема заключалась в SQLiteDatabaseHelper. Я не реализовал метод onUpdate(). Поскольку моя база данных уже существовала на устройстве с другим макетом (поле BLOB-объекта не существовало), метод insert не удался.

Быстрая деинсталляция .apk устранила проблему. Я мог бы также реализовать метод onUpdate, поэтому при изменении версии базы данных происходит удаление или обновление таблицы.

Комментарии:

1. Другая вещь, которую вы могли бы сделать, это увеличить версию базы данных, которую вы передаете своему конструктору DBHelper, чтобы Android автоматически вызывал функцию onUpgrade() вашего помощника. Вы можете просто удалить свои таблицы БД и снова вызвать onCreate() оттуда, чтобы автоматически воссоздать все. Просто еще один вариант, который немного упрощает разработку.