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()
中的升级。这应该可以解决问题。
我在我的 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()
中的升级。这应该可以解决问题。