數(shù)據(jù)庫是Android 數(shù)據(jù)持久化操作的解決方案之一薛匪。
以保存User信息為例移必,需要用到3個類:
- UserBean
JavaBean是最標準的POJO啄踊,里面有一個無參構造方法掖蛤、純粹的get/set方法杀捻、實現(xiàn)Serializable接口可序列化,沒有業(yè)務邏輯蚓庭。
- UserDB
即SQL語句操作
- UserDBDao
DAO提供了和數(shù)據(jù)庫打交互的方法致讥,這里通常寫獲取連接、關閉連接彪置、增刪改查的方法拄踪。
總結:
- user信息實際上是一張user表蝇恶。
- javabean是一個包含屬性和表中字段完全對應的類拳魁。并在該類中提供set和get方法來設置并獲得該類中的屬性。一個javabean類與一個數(shù)據(jù)庫中的表相對應撮弧,也就是說潘懊,有多少表姚糊,就應該有多少javabean類。而實例化的javabean對象則代表一個表中的一行數(shù)據(jù)授舟。
- Dao實現(xiàn)類通過連接數(shù)據(jù)庫進行數(shù)據(jù)庫操作救恨。一個Dao實現(xiàn)類對應一個表,如UserDBDao類對應user表释树,該類中將定義對該表的所有的操作肠槽。
例子:
public class UserBean{
private String name;
private String pass;
private String userID;
private boolean infoCompleted;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getPass(){
return pass;
}
public void setPass(String pass){
this.pass = pass;
}
public String getUserID(){
return userID;
}
public void setUserID(String userID){
this.userID = userID;
}
public boolean isInfoCompleted(){
return infoCompleted;
}
public void setInfoCompleted(boolean infoCompleted){
this.infoCompleted = infoCompleted;
}
}
public class UserDB extends SQLiteOpenHelper{
private static final String DB_NAME = "test";
private static final int version = 1;
public String TABLE_NAME_USER = "users";
private String CREATE_TABLE_USER = "create table if not exists "
+ TABLE_NAME_USER
+ "(_id integer primary key autoincrement," +
"userid varchar(30),name varchar(30),pass varchar(30), is_complete int);";
public UserDB(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_TABLE_USER);
}
@Override
public void onOpen(SQLiteDatabase db){
db.execSQL(CREATE_TABLE_USER);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2){
}
}
public class UserDBDao{
private UserDB helper;
public UserDBDao(Context context) {
helper = new UserDB(context);
}
/**
* 添加用戶
*/
public long add(UserBean user){
if (isUserExist(user.getUserID())) { return -1; }
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("userid", user.getUserID());
values.put("name", user.getName());
values.put("pass", user.getPass());
values.put("is_complete", user.isInfoCompleted()?1:0);
long rowID = db.insert(helper.TABLE_NAME_USER, null, values);
db.close();
return rowID;
}
/**
* 查詢某個用戶是否存在
*/
public boolean isUserExist(String userid){
boolean result = false;
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query(helper.TABLE_NAME_USER, null, "userid=?",
new String[] { userid }, null, null, null);
if (cursor.moveToNext()){
result = true;
}
cursor.close();
db.close();
return result;
}
/**
* 查詢某個用戶
*/
public UserBean getUser(String userid){
if (!CommonUtil.isNotEmpty(userid)) { return null; }
UserBean bean = new UserBean();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query(helper.TABLE_NAME_USER, new String[] { "name", "pass", "is_complete" }, "userid=?", new String[] { userid }, null, null, null);
if (cursor.moveToNext()){
bean.setName(cursor.getString(0));
bean.setPass(cursor.getString(1));
bean.setInfoCompleted(cursor.getInt(2) == 0);
}
cursor.close();
db.close();
return bean;
}
/**
* 返回所有的用戶信息
*/
public List<UserBean> findAllUser(){
List<UserBean> allUsers = new ArrayList<UserBean>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query(helper.TABLE_NAME_USER, new String[] { "userid", "name", "pass", "is_complete" }, null, null, null, null, null);
while (cursor.moveToNext()){
UserBean bean = new UserBean();
bean.setUserID(cursor.getString(0));
bean.setName(cursor.getString(1));
bean.setPass(cursor.getString(2));
bean.setInfoCompleted(cursor.getInt(3) == 0);
allUsers.add(bean);
}
cursor.close();
db.close();
return allUsers;
}
/**
* 刪除一條用戶的記錄
*/
public boolean delete(String userId){
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete(helper.TABLE_NAME_USER, "userid=?", new String[] { userId });
db.close();
if (result > 0){
return true;
}
else{
return false;
}
}
/**
* 修改密碼
*/
public boolean updatePass(String userid, String pass){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("pass", pass);
int result = db.update(helper.TABLE_NAME_USER, values, "userid=?", new String[] { userid });
db.close();
if (result > 0){
return true;
}
else{
return false;
}
}
}
以上。
UserDBDao提供了對外操作數(shù)據(jù)的方法奢啥,外部只需要通過UserDBDao對象來對數(shù)據(jù)進行存取及其他操作即可秸仙。
如果你以前習慣用sharedpreferences來進行數(shù)據(jù)持久化操作的話,UserDBDao在某些方面也可以等價于其功能桩盲。
與sharedpreferences不同的是寂纪,sharedpreferences常用于輕量級的、單個類型的數(shù)據(jù)存取赌结,而DBDao則更傾向于整張表結構數(shù)據(jù)的存取操作捞蛋。