java - SQLite 通过 SELECT * 语句只返回第一行
问题描述
我在我的sqlite
表中保存了一些记录,并且记录保存得非常好。当我尝试检索这些记录时,问题就来了。假设我的 sqlite 中有 3 条记录,所以当我检索这些记录时,它会将第一条记录返回 3 次。计数是正确的,但为什么它只返回我的第一条记录 3 次?
这就是我检索记录的方式:
public ArrayList<Cursor> getAllBookings() {
ArrayList<Cursor> bookingsList = new ArrayList<>();
SQLiteDatabase readableDatabase = this.getReadableDatabase();
Cursor cursor = readableDatabase.rawQuery("SELECT * FROM " + BOOKING_TABLE, null);
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
bookingsList.add(cursor);
cursor.moveToNext();
}
return bookingsList;
}
请注意,我已经签table
入Mozilla SQLiteManager
并且所有记录都已成功存储。
解决方案
问题是当您应该提取并添加每个游标行包含的值时,您正在将游标本身添加到您的预订列表中。
因此,如果您有一个类 Booking 该方法应声明为
public List<Booking> getAllBookings() {
另外我认为最好在这里有一个 do/while 循环并运行它直到返回 false 并在循环内使用或类似方法cursor.moveToNext
提取所有值getString
List<Booking> bookingsList = new ArrayList<>();
//...
do {
Booking booking = new Booking();
booking.setSomething(cursor.getString("somethingColumn"));
//... other columns
bookingsList.add(booking);
} while (cursor.moveToNext());
如果您没有自定义类,则可以为每一行使用数组或列表。
推荐阅读
- python - Python 根据往年可用的相同日期填充缺失值
- angular - 在 Http 主机不工作的情况下获取用户位置
- c# - 在 Lambda 表达式 C# 中更改内部选择值
- android-studio-3.5 - 为什么应用更改功能仅适用于 android studio 3.5 中 API 26 及更高版本的设备
- c - cudaSetDevice() 编号是否跨进程一致?
- python - 在 docker 容器中运行 python 脚本时导入错误?
- r - “ward”方法已重命名为“ward.D”;注意新的“ward.D2”错误
- c# - 在两个日期之间每周获取星期一的日期
- javascript - 我的模式上的确认删除按钮不起作用
- python - python使用具有多个条件的lambda函数对列表进行排序