gpt4 book ai didi

java - Android - 数据库插入未插入

转载 作者:行者123 更新时间:2023-12-01 11:57:40 25 4
gpt4 key购买 nike

我在我的 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);
}
}

这些条目被分配了一个新的行 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 的内容。我对列名使用最终变量,因此不要认为列名有错误。无论如何,这都会显示为 -1 的行值,但事实并非如此。

为什么代码的一个实现能够成功插入,而另一个却不能成功?

最佳答案

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

关于java - Android - 数据库插入未插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28304240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com