Я использую базу данных в своем приложении для Android. Я следую руководство здесь:Android - Вставка базы данных не вставляет
http://developer.android.com/training/basics/data-storage/databases.html
У меня есть класс «DatabaseHelper», который проходит SQLiteOpenHelper
как предложено, и у меня есть контракт, который содержит информацию о таблице и реализует «BaseColumns». В этом, у меня есть функция для вставки новой строки в базу данных:
public static void addUploadInfo(SQLiteOpenHelper dbHelper, UploadInfo info) {
// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = info.getContentValues();
// Insert the new row, returning the primary key value of the new row
long newRowId;
newRowId = db.insert(
UploadInfoTable.TABLE_NAME,
null,
values);
db.close(); // Closing database connection
info.setDatabaseId(newRowId);
}
Я использую базу данных для хранения приложений, связанных метаданных о файле. Когда я создаю новый файл, я запускаю указанную выше функцию, и строка успешно добавляется в базу данных (и при необходимости создается база данных). Я могу видеть его с помощью:
public static List<UploadInfo> getUploadInfoList(SQLiteOpenHelper dbHelper) {
List<UploadInfo> infoList = new ArrayList<>();
SQLiteDatabase db = dbHelper.getReadableDatabase();
String allQuery = "SELECT * FROM " + UploadInfoTable.TABLE_NAME;
Cursor cursor = db.rawQuery(allQuery, null);
if (cursor.moveToFirst()) {
do {
infoList.add(new UploadInfo(cursor));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return infoList;
}
Однако, когда приложение сначала загружает, я ввожу несколько начальных записей в базу данных с помощью:
@Override
public void onResume() {
super.onResume();
DatabaseHelper dbHelper = new DatabaseHelper(getActivity());
for (UploadInfo info: uploadList) {
UploadInfoTable.addUploadInfo(dbHelper, info);
}
}
Эти записи присваивается новый идентификатор строки, который появляется правильное значение (не -1, указывающее на ошибку). В журнале нет ошибок. Однако они не найдены, когда я буду запускать getUploadInfoList
.
Я также попробовал эту альтернативную функцию вставки:
public static void addUploadInfo(SQLiteOpenHelper dbHelper, UploadInfo info) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = info.getContentValues();
// Insert the new row, returning the primary key value of the new row
db.beginTransaction();
long newRowId = -1;
try {
newRowId = db.insertOrThrow(
UploadInfoTable.TABLE_NAME,
null,
values);
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
db.close(); // Closing database connection
info.setDatabaseId(newRowId);
}
, но я вижу один и тот же результат. Ни в коем случае информация не указана. Я всегда регистрирую содержимое ContentValues
. Я использую конечные переменные для имен столбцов, поэтому не думаю, что у меня есть ошибка в имени столбца. В любом случае это будет отображаться как значение строки -1, и это не так.
Почему одна реализация кода вставляется успешно, а другая нет?
Вы удаляете записи 'onPause()'? – gknicker
@gknicker Нет, я удаляю только записи о действиях пользователя. Вышеуказанный 'onResume' является упрощением и добавляет только записи, если пользователь обновляется с предыдущей системы. –
А, ок. В этом случае я подозреваю вашу логику обновления. Замечание стороны: похоже, что 'onCreate()' или 'onStart()' будет лучшим местом для вашего кода. – gknicker