在Udacity的开发Android应用程序中,他们正在构建的应用程序在从openweathermap api获取数据后,在列表视图中显示天气预报。数据通过下面显示的函数bulkInsert保存到db中。通过菜单中的“刷新”选项调用更新。
没有代码处理旧数据的修剪,但每次刷新后数据库中的行数保持不变。事实证明,在插入14个新行的循环之后,最后14个旧行消失了。后者有新的行ID。
示例:
我们从:
开始_id=55
_id=56
_id=57
…
_id=721
_id=722
_id=723
_id=724
_id=725
_id=726
批量插入后,ID列表变为:
_id=55
_id=56
_id=57
…
_id=735
_id=736
_id=737
_id=738
_id=739
_id=740
缺少/替换行713-726。 bulkinsert的代码:
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
switch (match) {
case WEATHER:
db.beginTransaction();
int returnCount = 0;
try {
for (ContentValues value : values) {
normalizeDate(value);
long _id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, value);
if (_id != -1) {
returnCount++;
Log.i(“id:”, " "+_id);
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
getContext().getContentResolver().notifyChange(uri, null);
return returnCount;
default:
return super.bulkInsert(uri, values);
}
}
insert是vanilla SQLiteDatabase方法,它不应该弄乱现有的行。然而,当该行被注释掉时,旧行仍保留在数据库中。
有什么想法发生了什么?