2012-06-27 97 views
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(); 
} 

用戶類屬性的SQLite SELECT *查詢只在第一列返回值

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

請發佈用戶的構造函數。 – Sam

+0

@Sam Allright,更新後的問題 – Johan

+0

難道它是你選擇之前的多餘空格嗎? – Qben

回答

1

我能想象這樣一個場景:你正在開發的DB計劃,並在一些版本的表只有_id列。您運行該應用程序,因此它會創建數據庫/表。然後,將所有其餘列添加到表創建代碼中,但由於表已經創建,代碼不會再次執行,所以表保持不變。如果這個理論是真的,那麼重新安裝應用程序應該修復它。

UPDATE:

我希望KEY_ID是 「_id」?如果沒有,請修復。也爲KEY_ID的SQL應該是:

KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 

UPDATE2:

對不起,上面搞砸DB ID與你的業務邏輯的用戶ID我的更新部分。所以我建議使用KEY_UID(「uid」)作爲業務邏輯用戶標識和KEY_DB_ID(「_id」)作爲數據庫標識。

+0

我收到以下插入錯誤:'錯誤代碼19:約束失敗' – Johan

+0

@Johan:請檢查UPDATE部分。另外,我不知道如何處理數據庫方案遷移,因此請確保在檢查固定版本之前卸載舊版本。 –

+0

哇,這是'AUTOINCREMENT'問題。我在網上讀到它應該默認自動增加,所以我沒有添加它。非常感謝! – Johan

1

您應該使用Cursor.getColumnIndex(String columnName)來返回該列的索引以輸入到Cursor.getString(long index)

請確保在查詢之後但在循環查看結果之前執行此操作,否則將會效率低下。

而且你應該使用SQLiteDatabase.query(...)而不是原始查詢,以降低複雜性

UPDATE

你不應該,如果你希望它沒有在列定義

聲明AUTOINCREMENT自動增量specifiy爲KEY_ID列中的值
+0

謝謝,但仍然沒有運氣... – Johan

+0

+1改善我的代碼雖然:) – Johan