Android 了解SQLite

Android 了解SQLite,android,android-sqlite,Android,Android 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

我试图理解如何处理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;
                          }
然后,我有以下帮助类来创建和更新数据库:

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;
  }
} 
公共类成员数据源{
//数据库字段
专用数据库;
私有成员sqlitehelper dbHelper;
私有字符串[]allColumns={MemberSQLiteHelper.COLUMN\u ID,
MemberSQLiteHelper.COLUMN\u NAME、MemberSQLiteHelper.COLUMN\u PHONE、MemberSQLiteHelper.COLUMN\u EMAIL、MemberSQLiteHelper.COLUMN\u WEIGHT};
公共成员数据源(上下文){
dbHelper=newmembersqlitehelper(上下文);
}
public void open()引发SQLException{
database=dbHelper.getWritableDatabase();
}
公众假期结束(){
dbHelper.close();
}
公共成员createMember(字符串名称、字符串电话、字符串电子邮件、整数权重){
ContentValues=新的ContentValues();
value.put(MemberSQLiteHelper.COLUMN\u NAME,NAME);
value.put(MemberSQLiteHelper.COLUMN\u PHONE,PHONE);
value.put(MemberSQLiteHelper.COLUMN_EMAIL,EMAIL);
value.put(MemberSQLiteHelper.COLUMN_WEIGHT,WEIGHT);
long insertId=database.insert(MemberSQLiteHelper.TABLE_MEMBERS,null,value);
Cursor Cursor=database.query(MemberSQLiteHelper.TABLE_MEMBERS,allColumns,MemberSQLiteHelper.COLUMN_ID+“=”+insertId,null,
空,空,空);
cursor.moveToFirst();
成员newMember=游标成员(游标);
cursor.close();
返回新成员;
}
公共作废删除成员(成员){
long id=member.getId();
delete(MemberSQLiteHelper.TABLE_MEMBERS,MemberSQLiteHelper.COLUMN_ID
+“=”+id,空);
}
公共列表getAllMembers(){
列表成员=新的ArrayList();
Cursor Cursor=database.query(MemberSQLiteHelper.TABLE_成员,
所有列,null,null,null,null,null,null);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
成员成员=游标成员(游标);
成员。添加(成员);
cursor.moveToNext();
}
//确保关闭光标
cursor.close();
返回成员;
}
私有成员游标成员(游标){
成员=新成员();
member.setId(cursor.getLong(0));
member.setName(cursor.getString(1));
member.setPhone(cursor.getString(2));
member.setEmail(cursor.getString(3));
成员.setWeight(cursor.getInt(4));
返回成员;
}
} 
还有问题

例如,如何更改数据库中已存在的成员的名称?(一)

如果他们有更多的电话号码,是否可以保存Arraylist?(二)


而且,如果我删除数据库中的一行,那么ID是否会更改以下行?或者,当我想要检索同一个成员时,是否可以始终引用相同的ID?那么,通过其他方式,一旦创建,成员是否保持相同的ID?(3)

您只需向
成员数据源添加一个方法即可更新成员:

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) });
}
至于保留多个电话号码,您最好创建第二个表。它可以有
\u id
phone
phone\u type
列。然后,您可以从主表中删除
phone
作为一列,或者将其用作“主要”电话号码,并将phones表用作其他号码


关于您的新问题3:删除一行时,不会影响其他行(禁用触发器)。特别是,其他ID值不会更改。

如果要保存arraylist,请尝试将其转换为JSONObject谢谢!我要试试看!我更新了我的答案来回答你的最后一个问题。非常感谢!这真的很有帮助!还有一个关于updateMember的问题。我得到以下错误:类型SQLiteDatabase中的方法update(String,ContentValues,String,String[])不适用于参数(String,ContentValues,String,long)@Diego-Oops。最后一个论点是错误的。我修改了代码以显示一种方法。您也可以直接将id插入WHERE子句参数中,这样最后两个参数将是:
MemberSQLiteHelper.COLUMN\u id+“=”+id,null
。通常,我避免将值直接插入SQL(以帮助防止注入攻击),但在这种情况下,它是相当安全的。