只显示最后一行 sqlite 数据库

Only last row of sqlite database is being displayed

这是我的sqlite数据库代码

public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_USER + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"+ SERVER_ID + " TEXT,"+ ACCESS_TOKEN + " TEXT," + FIRST_NAME
                + " TEXT," + LAST_NAME + " TEXT," + USER_EMAIL + " TEXT,"
                + USERNAME + " TEXT," + ADDRESS + " TEXT," + LATITUDE + " TEXT,"
                + LONGITUDE + " TEXT," + BLOOD_GROUP + "  TEXT," + GENDER + " TEXT,"
                + PHONE_NUMBER + " TEXT," + MOBILE_NUMBER + " TEXT," + DOB_YEAR + " TEXT,"
                + DOB_MONTH + " TEXT," + DOB_DAY + " TEXT," + COUNTRY + " TEXT," + IMAGE_URL
                + "  TEXT," + TYPE + " TEXT" +");";
        db.execSQL(CREATE_LOGIN_TABLE);

这是我从 table

获取所有值的代码
 public HashMap<String, String> getBPositiveData(){
        HashMap<String, String> getData = new HashMap<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from user where type =? and blood_group =?", new String[]{"friends", "B_plus"});
        //Move to first
       if (cursor.moveToFirst()){

           do {
                   getData.put("server_id", cursor.getString(1));
                   getData.put("first_name", cursor.getString(3));
                   getData.put("last_name", cursor.getString(4));
                   getData.put("blood_group", cursor.getString(10));
                   getData.put("mobile_number", cursor.getString(13));
                   getData.put("imageURL", cursor.getString(18));
                   cursor.moveToNext();
               int abc = cursor.getCount();
               Log.e("cursorCount", String.valueOf(abc));
           }while (!cursor.isAfterLast());
           cursor.close();
        }
        return getData;
    }

在我的数据库中,所有行都已正确插入,查询也为我提供了所需的数据(我从 genymotion 模拟器检查了数据库,因此我确信数据存在于那里)。我的问题是我只能从 table 的最后一行中获取值。谁能告诉我我在这里做错了什么?我用来检索 activity 中的值的代码是这样的:

HashMap<String, String> profile = db.getBPositiveData();
                final String fname = profile.get("first_name");
                final String lname = profile.get("last_name");
                final String bgroup = profile.get("blood_group");
                final String mnumber = profile.get("mobile_number");
                final String iurl = profile.get("imageURL");

提前谢谢你。

尝试将您的 "if (cursor.moveToFirst())" 作为 "while (cursor.next()" 循环,并在循环中 return 您的 getData。

可以在 adding data to hashmap from database 中看到我正在谈论的示例。

对于每次迭代,您都会在 Hashmap 中覆盖您的 dara。例如,您可以只有一把钥匙 "server_id"。对于第一条记录,您的代码将

getData.put("server_id", cursor.getString(1));
调用

时的第二条记录

getData.put("server_id", cursor.getString(1));
它覆盖了。

创建一个新的 class 用户

public class 用户 {

String first_name;
String last_name;
String blood_group;
// ...the rest of the propertied
}  

更改 getData 的 HashMap 声明

HashMap userList = new HashMap<>();

然后修改你的代码

User currentUser = null;
if(cursor.moveToFirst())
{

    do {
        currentUser = new User();
        currentUser.first_name = cursor.getString(3);
        currentUser.last_name = cursor.getString(4);
        currentUser.blood_group = cursor.getString(10);
        // the rest of your data for user
        String rowKey = cursor.getString(cursor.getColumnIndexOrThrow("_id"));
        userList.put(rowKey, currentUser);
        cursor.moveToNext();

        // the rest of your code

    } while (!cursor.isAfterLast());
    cursor.close();
    return userList;
}  

然后相应地将方法的 return 类型从 HashMap 更改为 HashMap。

让我知道这是否适合你

首先您需要创建对象 class,例如。 User

public class User {

    private String firstName;

    private String lastName;

    private String bloodGroup;

    private String mobileNumber;

    private String imageUrl;

    public User() {

    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getBloodGroup() {
        return bloodGroup;
    }

    public void setBloodGroup(String bloodGroup) {
        this.bloodGroup = bloodGroup;
    }

    public String getMobileNumber() {
        return mobileNumber;
    }

    public void setMobileNumber(String mobileNumber) {
        this.mobileNumber = mobileNumber;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
}

然后获取用户B-正用户:

public List<User> getBPositiveUsers() {
    List<User> users = new ArrayList<>();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from user where type =? and blood_group =?", new String[]{"friends", "B_plus"});

    try {
        if (cursor.moveToFirst()) {
            do {
                User user = new User();

                user.setFirstName(cursor.getString(3));
                user.setLastName(cursor.getString(4));
                user.setBloodGroup(cursor.getString(10));
                user.setMobileNumber(cursor.getString(13));
                user.setImageUrl(cursor.getString(18));

                users.add(user);
            } while(cursor.moveToNext());
        }
    } catch (Exception e) {
        Log.d("ERROR", "Error while trying to get users from database");
    } finally {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }

    return users;
}
  1. 使用游标时,try-catch-finally 块总是很好。

  2. user.setFirstName(cursor.getString(3)); 是丑陋的用法。 如果您将列名作为常量(我假设您正在使用它,因为在创建时您使用的是 ex.FIRST_NAME),如果您更改此行和其他类似于 user.setFirstName(cursor.getString(cursor.getColumnIndex(FIRST_NAME)));[= 的行会更好17=]

  3. 检查 Lombok 为变量创建 getter 和 setter。它使代码更易于阅读:)