Android - 数据库插入未插入

Android - Database insert not inserting

我在我的 Android 应用程序中包括了一个数据库。我在这里遵循指南:

http://developer.android.com/training/basics/data-storage/databases.html

我有一个 "DatabaseHelper" class 按照建议扩展了 SQLiteOpenHelper,我有一个包含 table 信息并实现 '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);
    }
}

这些条目被分配了一个新的行 ID,该 ID 似乎是正确的值(不是 -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。我使用 final 变量作为列名,所以不要认为我的列名有误。这无论如何都会显示为 -1 的行值,但事实并非如此。

为什么代码的一种实现插入成功而另一种不成功?

我怀疑您在 onResume() 中的代码没有成功检测到升级。而是将所有与升级有关的代码放在 onUpgrade() 中,而不是尝试检测 onResume() 中的升级。这应该可以解决问题。