public List<User> getAllUsers() {
List<User> userList = new ArrayList<User>();
String selectQuery = "SELECT * FROM " + TABLE_USERS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
User user = new User(cursor.getString(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4),cursor.getString(5),cursor.getString(6));
userList.add(user);
} while (cursor.moveToNext());
}
return userList;
}
public void addUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, user._id); // User id
values.put(KEY_BLUETOOTH_NAME, user._bluetooth_name);
values.put(KEY_COLOR, user._color);
values.put(KEY_LAST_LAT, user._last_lat);
values.put(KEY_LAST_LNG, user._last_lng);
values.put(KEY_MODEL, user._model);
values.put(KEY_LAST_SEEN, user._last_seen);
db.insert(TABLE_USERS, null, values);
db.close();
}
用户类属性
public class User {
String _id;
String _bluetooth_name;
String _color;
String _last_seen;
String _model;
String _last_lng;
String _last_lat;
public User(String id, String bluetooth_name, String color, String last_seen, String model, String last_lng, String last_lat){
this._id = id;
this._bluetooth_name = bluetooth_name;
this._color = color;
this._last_seen = last_seen;
this._model = model;
this._last_lat = last_lat;
this._last_lng = last_lng;
}
}
DatabaseHandler dh = new DatabaseHandler(getApplicationContext());
dh.clearTable(); //clear the table
User user = new User("1","2","3","5","6","7","8"); //add dummy user
dh.addUser(user);
List<User> userlist = dh.getAllUsers(); //all users properties are null, except "id" (which is the first prop, value: "1")
可能是一个简单的问题,因为这是我第一次尝试在android中使用SQLite:
我正在尝试将我添加到用户SQLite表中的所有用户。但是只设置了所有用户的第一个属性“id”。有人可以解释一下原因吗?
更新
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_USERS + "(" +
KEY_ID + " INTEGER PRIMARY KEY," +
KEY_BLUETOOTH_NAME + " TEXT," +
KEY_COLOR + " TEXT," +
KEY_LAST_LAT + " TEXT," +
KEY_LAST_LNG + " TEXT," +
KEY_LAST_SEEN + " TEXT," +
KEY_MODEL + " TEXT" + ")";
db.execSQL(CREATE_USERS_TABLE);
}
答案 0 :(得分:1)
我可以想象这样的场景:你正在开发数据库方案,在某些版本中,表只有_id
列。您运行该应用程序,因此它会创建数据库/表。然后将所有其余列添加到表创建代码中,但由于表已经创建,因此代码不会再次执行,因此表保持不变。如果这个理论是正确的,那么重新安装应用程序应该解决它。
<强>更新强>
我希望KEY_ID
是“_id”?如果没有,请修复。 KEY_ID
的SQL也应该是:
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
<强> UPDATE2:强>
抱歉,上面的UPDATE部分搞砸了您的业务逻辑用户ID的数据库ID。所以我建议将KEY_UID
(“uid”)用于业务逻辑用户ID,并将KEY_DB_ID
(“_ id”)用于DB id。
答案 1 :(得分:1)
您应该使用Cursor.getColumnIndex(String columnName)返回列的索引以输入Cursor.getString(long index)
。
请确保在查询后但在循环搜索结果之前执行此操作,否则效率会相当低。
此外,您应该使用SQLiteDatabase.query(...)而不是原始查询来降低复杂性
更新
如果要在不定义列定义中的AUTOINCREMENT的情况下自动增量,则不应指定KEY_ID列的值