我在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);
}
但我看到了同样的结果。在任何情况下都不是info null。我总是记录ContentValues
的内容。我对列名使用最终变量,所以不要认为列名中有错误。无论如何,这将显示为-1的行值,并且它不会。
为什么一个代码的实现成功插入而另一个没有?
答案 0 :(得分:1)
我怀疑onResume()
中的代码未能成功检测到升级。而是将所有代码与onUpgrade()
中的升级有关,而不是尝试在onResume()
中检测升级。这应该可以解决这个问题。