2015-02-03 3 views
0

Я использую базу данных в своем приложении для 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, и это не так.

Почему одна реализация кода вставляется успешно, а другая нет?

+0

Вы удаляете записи 'onPause()'? – gknicker

+0

@gknicker Нет, я удаляю только записи о действиях пользователя. Вышеуказанный 'onResume' является упрощением и добавляет только записи, если пользователь обновляется с предыдущей системы. –

+0

А, ок. В этом случае я подозреваю вашу логику обновления. Замечание стороны: похоже, что 'onCreate()' или 'onStart()' будет лучшим местом для вашего кода. – gknicker

ответ

1

Я подозреваю, что ваш код в onResume() не удалось обнаружить обновление. Скорее всего, весь ваш код должен быть связан с обновлением в onUpgrade() вместо того, чтобы пытаться обнаружить обновление в onResume(). Это должно решить проблему.

+0

Переключение на использование 'onUpgrade' (или' onCreate') внесло разницу. Я действительно не понимаю, почему, но, должно быть, была проблема с моей логикой. Благодарю. –