【问题标题】:SQLite select * query only returning values on first columnSQLite select * 查询只返回第一列的值
【发布时间】:2012-06-28 07:08:20
【问题描述】:
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);
 }

【问题讨论】:

  • 请贴出User的构造函数。
  • @Sam 好的,更新问题
  • 可能是您选择的 * 之前的多余空格吗?
  • @Qben 不,仍然只获取 _id 属性:/
  • @Johan:请发布创建数据库的代码。

标签: android sqlite


【解决方案1】:

我可以想象这样的场景:您正在开发数据库方案,而在某些版本中,该表只有 _id 列。您运行应用程序,因此它会创建数据库/表。然后将所有其余列添加到表创建代码中,但由于表已经创建,代码不会再次执行,因此表保持不变。如果这个理论是正确的,那么重新安装应用程序应该可以解决它。

更新:

我希望KEY_ID 是“_id”?如果不是,请修复。 KEY_ID 的 SQL 也应该是:

KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +

更新 2:

抱歉,我上面的 UPDATE 部分将 DB id 与您的业务逻辑用户 id 混淆了。所以我建议使用KEY_UID(“uid”)作为业务逻辑用户id,KEY_DB_ID(“_id”)作为数据库id。

【讨论】:

  • 我收到以下插入错误:error code 19: constraint failed
  • @Johan:请查看更新部分。另外我不知道你是如何处理数据库方案迁移的,所以在检查修复之前一定要卸载旧版本。
  • 哇,问题出在AUTOINCREMENT。我在网上读到它应该默认自动递增,所以我没有添加它。非常感谢!
  • @Johan:请查看 UPDATE2 部分。对不起.. :)
  • 很好的答案,尽管添加 AUTOINCREMENT 不是必需的:“声明为 INTEGER PRIMARY KEY 的列将自动递增。” (SQLite.org) 它继续描述INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT NOT NULL 的同义词。
【解决方案2】:

您应该使用Cursor.getColumnIndex(String columnName) 来返回列的索引以馈入Cursor.getString(long index)

确保在查询之后但在遍历结果之前执行此操作,否则效率会很低。

您还应该使用SQLiteDatabase.query(...) 而不是原始查询来降低复杂性

更新

如果您希望 KEY_ID 列自动递增而不在列定义中声明 AUTOINCREMENT,则不应为其指定值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2015-08-03
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多