如何迭代和检索存储在 sqlite 数据库中的所有数据

How to iterate and retrieve over all data stored in sqlite database

我在从 sqlite 数据库检索数据时遇到问题我需要的是在控制台上检索所有数据。但是我在控制台上只得到一行数据 下面是从 Sqlite 插入和检索数据的代码。请说明我遗漏或做错了什么。感谢您的帮助。

 public long InsertContacts(Contacts contacts) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(KEY_IMAGE, DbUtility.getBytes(contacts.getBmp()));
            contentValues.put(KEY_BABY_NAME, contacts.getBaby_name());
            contentValues.put(KEY_GENDER, contacts.getBaby_gender());
            contentValues.put(KEY_SET_DATE, contacts.getDate());
            contentValues.put(KEY_SET_TIME, contacts.getTime());


            return db.insert(TABLE_NAME, null, contentValues);


        }

        public Contacts retriveContactsDetails() {

            SQLiteDatabase db = this.getReadableDatabase();
            String[] columns = new String[]{KEY_IMAGE, KEY_BABY_NAME, KEY_GENDER, KEY_SET_DATE, KEY_SET_TIME};
            Cursor cursor = db.query(TABLE_NAME, columns, null, null, null, null, null);
           cursor.moveToFirst();
                while (cursor.isAfterLast() == false) {

                    byte[] blob = cursor.getBlob(cursor.getColumnIndex(KEY_IMAGE));
                    String name = cursor.getString(cursor.getColumnIndex(KEY_BABY_NAME));
                    String gender = cursor.getString(cursor.getColumnIndex(KEY_GENDER));
                    String date = cursor.getString(cursor.getColumnIndex(KEY_SET_DATE));
                    String time = cursor.getString(cursor.getColumnIndex(KEY_SET_TIME));

                    Log.d(TAG, DbUtility.getImage(blob) + name + "-" + gender + "-" + date + "- " + time); // I need to get all date here that have been inserted but i am getting only first rows data every time i insert.
                    cursor.moveToNext();
                    return new Contacts(DbUtility.getImage(blob), name, gender, date, time);

                }

                cursor.close();
                return null;
            }

        }

Contacts.java

public class Contacts {


    private Bitmap bmp;
    private String baby_name;
    private String baby_gender;
    private String date;
    private String time;

    public Contacts(Bitmap b, String n, String g, String d, String t) {
        bmp = b;
        baby_name = n;
        baby_gender = g;
        date = d;
        time = t;
    }
    public Bitmap getBmp() {
        return bmp;
    }

    public String getBaby_name() {
        return baby_name;
    }

    public String getBaby_gender() {
        return baby_gender;
    }

    public String getDate() {
        return date;
    }

    public String getTime() {
        return time;
    }
}

    public Contacts retriveContactsDetails() {
            ...
            while (cursor.isAfterLast() == false) {
                ...
                cursor.moveToNext();
                return new Contacts(...);
            }

您的 Contacts class 命名错误,因为它只包含一个联系人。它应该命名为 Contact.

return 语句按照它说的去做,它 return 来自函数。所以循环体不能执行多次

您真正想要做的是构造一个联系人列表,在每次循环迭代中将一个联系人对象添加到列表中,然后 return 该列表最后。

您应该将 retriveContactsDetails() 更改为:

public List<Contacts> retriveContactsDetails() {
    SQLiteDatabase db = this.getReadableDatabase();
    String[] columns = new String[]{KEY_IMAGE, KEY_BABY_NAME, KEY_GENDER, KEY_SET_DATE, KEY_SET_TIME};

    List<Contacts> contactsList = new ArrayList<>();

    Cursor cursor;
    try {
        cursor = db.query(TABLE_NAME, columns, null, null, null, null, null);

        while(cursor.moveToNext()) {
            byte[] blob = cursor.getBlob(cursor.getColumnIndex(KEY_IMAGE));
            String name = cursor.getString(cursor.getColumnIndex(KEY_BABY_NAME));
            String gender = cursor.getString(cursor.getColumnIndex(KEY_GENDER));
            String date = cursor.getString(cursor.getColumnIndex(KEY_SET_DATE));
            String time = cursor.getString(cursor.getColumnIndex(KEY_SET_TIME));

            contactsList.add(new Contacts(DbUtility.getImage(blob), name, gender, date, time));
            Log.d(TAG, DbUtility.getImage(blob) + name + "-" + gender + "-" + date + "- " + time);
        }
    } catch (Exception ex) {
        // Handle exception
    } finally {
        if(cursor != null) cursor.close();
    }

    return contactsList;
}

此外,您的 Contacts class 应该命名为 Contact,因为它只包含您的对象的一个​​实例。