0
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を使用する最初の試みであるため、おそらく簡単な質問です。

users 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);
 }
4

2 に答える 2

1

私はそのようなシナリオを想像することができます.DBスキームを開発していて、あるバージョンではテーブルには_id列しかありません. アプリを実行すると、DB/テーブルが作成されます。次に、残りのすべての列をテーブル作成コードに追加しますが、テーブルは既に作成されているため、コードは再度実行されないため、テーブルは変更されません。この理論が正しい場合、アプリを再インストールすると問題が解決するはずです。

アップデート:

KEY_ID「_id」だといいのですが?そうでない場合は、修正してください。また、SQLは次のKEY_IDようになります。

KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +

更新 2:

申し訳ありませんが、上記の私の UPDATE セクションは、ビジネス ロジックのユーザー ID で DB ID を台無しにしました。したがってKEY_UID、ビジネス ロジックのユーザー ID には ("uid") を使用KEY_DB_IDし、DB ID には ("_id") を使用することをお勧めします。

于 2012-06-27T22:22:52.397 に答える
1

Cursor.getColumnIndex(String columnName)を使用して、フィードする列のインデックスを返す必要がありますCursor.getString(long index)

クエリの後、ただし結果をループする前にこれを行うようにしてください。そうしないと、かなり非効率的になります。

また、複雑さを軽減するために、生のクエリではなくSQLiteDatabase.query(...)を使用する必要があります

アップデート

列定義で AUTOINCREMENT を宣言せずに自動インクリメントする場合は、KEY_ID 列の値を指定しないでください。

于 2012-06-27T22:26:45.903 に答える