2013-01-08 28 views
0

我想了解如何處理SQLite。我有一個與以下類的會員數據庫:瞭解SQLite

package com.appiclife.saldo.data;

public class Member { 

    private long id; 
    private String name; 
    private String phone; 
    private String email; 
    private int weight; 

    public long getId() { 
      return id; 
      } 

      public void setId(long id) { 
      this.id = id; 
      } 

     public String getName() { 
     return name; 
     } 

     public void setName(String name) { 
     this.name = name; 
     } 

     public String getPhone() { 
      return phone; 
      } 

     public void setPhone(String phone) { 
      this.phone = phone; 
      } 

     public String getEmail() { 
        return email; 
        } 

     public void setEmail(String email) { 
        this.email = email; 
        } 
     public int getWeight() { 
        return weight; 
          } 

     public void setWeight(int weight) { 
        this.weight = weight; 
          } 

然後,我有以下助手類來創建和更新數據庫:

我有以下幾種方法:

public class MembersDataSource { 

    // Database fields 
    private SQLiteDatabase database; 
    private MemberSQLiteHelper dbHelper; 
    private String[] allColumns = { MemberSQLiteHelper.COLUMN_ID, 
     MemberSQLiteHelper.COLUMN_NAME, MemberSQLiteHelper.COLUMN_PHONE, MemberSQLiteHelper.COLUMN_EMAIL, MemberSQLiteHelper.COLUMN_WEIGHT}; 

    public MembersDataSource(Context context) { 
    dbHelper = new MemberSQLiteHelper(context); 
    } 

    public void open() throws SQLException { 
    database = dbHelper.getWritableDatabase(); 
    } 

    public void close() { 
    dbHelper.close(); 
    } 

    public Member createMember(String name, String phone, String email, int weight) { 
    ContentValues values = new ContentValues(); 
    values.put(MemberSQLiteHelper.COLUMN_NAME, name); 
    values.put(MemberSQLiteHelper.COLUMN_PHONE, phone); 
    values.put(MemberSQLiteHelper.COLUMN_EMAIL, email); 
    values.put(MemberSQLiteHelper.COLUMN_WEIGHT, weight); 
    long insertId = database.insert(MemberSQLiteHelper.TABLE_MEMBERS, null, values); 
    Cursor cursor = database.query(MemberSQLiteHelper.TABLE_MEMBERS, allColumns, MemberSQLiteHelper.COLUMN_ID + " = " + insertId, null, 
     null, null, null); 
    cursor.moveToFirst(); 
    Member newMember = cursorToMember(cursor); 
    cursor.close(); 
    return newMember; 
    } 

    public void deleteMember(Member member) { 
    long id = member.getId(); 
    database.delete(MemberSQLiteHelper.TABLE_MEMBERS, MemberSQLiteHelper.COLUMN_ID 
     + " = " + id, null); 
    } 

    public List<Member> getAllMembers() { 
    List<Member> members = new ArrayList<Member>(); 

    Cursor cursor = database.query(MemberSQLiteHelper.TABLE_MEMBERS, 
     allColumns, null, null, null, null, null); 

    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     Member member = cursorToMember(cursor); 
     members.add(member); 
     cursor.moveToNext(); 
    } 
    // Make sure to close the cursor 
    cursor.close(); 
    return members; 
    } 

    private Member cursorToMember(Cursor cursor) { 
    Member member = new Member(); 
    member.setId(cursor.getLong(0)); 
    member.setName(cursor.getString(1)); 
    member.setPhone(cursor.getString(2)); 
    member.setEmail(cursor.getString(3)); 
    member.setWeight(cursor.getInt(4)); 
    return member; 
    } 
} 

而且問題,

哪有我改變例如已經在數據庫中的成員的名字? (1)

是否有可能保存一個Arraylist,例如,如果他們有更多的phonenumbers? (2)

而且,如果我刪除數據庫中的一行,請更改以下行的ID?或者,當我想要檢索同一個成員時,我是否可以始終引用相同的ID?所以通過其他方式,一旦創建成員保持相同的ID? (3)

+1

如果你想保存一個arraylist,請嘗試將它轉換爲JsonObject – dumazy

+0

謝謝!我要去嘗試一下! – Diego

+0

我更新了我的答案以解決您最後的問題。 –

回答

2

你只需要添加一個方法MembersDataSource更新的成員:

public void updateMember(Member member) { 
    long id = member.getId(); 
    ContentValues values = new ContentValues(); 
    values.put(MemberSQLiteHelper.COLUMN_NAME, name); 
    values.put(MemberSQLiteHelper.COLUMN_PHONE, phone); 
    values.put(MemberSQLiteHelper.COLUMN_EMAIL, email); 
    values.put(MemberSQLiteHelper.COLUMN_WEIGHT, weight); 
    database.update(MemberSQLiteHelper.TABLE_MEMBERS, values, 
     MemberSQLiteHelper.COLUMN_ID + " = ?", 
     new String[] { Integer.toString(id) }); 
} 

至於保留多個電話號碼,你可能會更好過創建第二個表。它可以有列_idphonephone_type。然後,您可以從主表中刪除phone作爲列,或者將其用作「主要」電話號碼,並將電話號碼錶用於其他號碼。

關於你的新問題3:當你刪除一行時,沒有其他行受到影響(禁止觸發器)。特別是,其他ID值不會改變。

+0

非常感謝!這真的有幫助!還有一個關於updateMember的問題。我得到以下錯誤:SQLiteDatabase類型中的方法update(String,ContentValues,String,String [])不適用於參數 (String,ContentValues,String,long) – Diego

+0

@Diego - Oops。最後一個觀點是錯誤的。我修復了代碼以顯示一種做法。你也可以直接插入id到WHERE子句的參數,所以最後兩個參數是:'MemberSQLiteHelper.COLUMN_ID +「=」+ id,null'。通常我會避免將值直接插入到SQL中(以幫助防止注入攻擊),但在這種情況下,它非常安全。 –