只显示最后一行 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;
}
使用游标时,try-catch-finally 块总是很好。
user.setFirstName(cursor.getString(3));
是丑陋的用法。
如果您将列名作为常量(我假设您正在使用它,因为在创建时您使用的是 ex.FIRST_NAME
),如果您更改此行和其他类似于 user.setFirstName(cursor.getString(cursor.getColumnIndex(FIRST_NAME)));
[= 的行会更好17=]
检查 Lombok 为变量创建 getter 和 setter。它使代码更易于阅读:)
这是我的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;
}
使用游标时,try-catch-finally 块总是很好。
user.setFirstName(cursor.getString(3));
是丑陋的用法。 如果您将列名作为常量(我假设您正在使用它,因为在创建时您使用的是 ex.FIRST_NAME
),如果您更改此行和其他类似于user.setFirstName(cursor.getString(cursor.getColumnIndex(FIRST_NAME)));
[= 的行会更好17=]检查 Lombok 为变量创建 getter 和 setter。它使代码更易于阅读:)