簡體   English   中英

理解SQLite

[英]Understanding SQLite

我正在努力了解如何處理SQLite。 我有一個包含以下類的成員數據庫:

包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;
                          }

然后我有以下HelperClass來創建和更新數據庫:

public class MemberSQLiteHelper extends SQLiteOpenHelper {

  public static final String TABLE_MEMBERS = "members";
  public static final String COLUMN_ID = "_id";
  public static final String COLUMN_NAME = "name";
  public static final String COLUMN_PHONE = "phone";
  public static final String COLUMN_EMAIL = "email";
  public static final String COLUMN_WEIGHT = "weight";

  private static final String DATABASE_NAME = "members.db";
  private static final int DATABASE_VERSION = 1;

  // Database creation sql statement
  private static final String DATABASE_CREATE = 
          "create table "
        + TABLE_MEMBERS + "(" + 
          COLUMN_ID + " integer primary key autoincrement, " + 
          COLUMN_NAME + " text not null, "+
          COLUMN_PHONE + " text, "+
          COLUMN_EMAIL + " text, "+
          COLUMN_WEIGHT + " integer);";

  public MemberSQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase database) {
    database.execSQL(DATABASE_CREATE);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(MemberSQLiteHelper.class.getName(),
        "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MEMBERS);
    onCreate(db);
  }

} 

我有以下方法:

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;
  }
} 

問題,

如何更改例如DB中已有成員的名稱? (1)

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

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

您只需要向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值會改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM