天天看點

安卓開發中SQLite的使用(附執行個體)

   在Android平台上系統内置了豐富的API來供開發人員操作SQLite,我們可以輕松的完成對資料的存取。下面以我自己建立的收入資訊表(InAccount)為例,來學習SQLite的使用。

      主要是四個步驟:

      1.建立資料庫類,繼承SQLiteOpenHelper。程式調用的包會自動導入。

public class DBOPenHelper extends SQLiteOpenHelper {
/** 資料庫版本号 */
private static final int VERSION = 1;
/** 資料庫名稱 */
private static final String DBNAME="account.db";

/** 重寫構造函數 */
public DBOPenHelper(Context context) {
super(context, DBNAME, null, VERSION);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 建立收入資訊表(ID,金額,時間,類型,備注)
db.execSQL("create table InAccount(ID integer primary key,Money decimal,Time varchar(10),Type varchar(10),Marks varchar(200))");

}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub

}

}      

View Code

      2.建立資料庫表,定義各個字段變量以及set和get方法。

set方法和get方法自動生成(建立各個字段變量後)

/**存入收入資訊*/
public class TB_InAccount {
/**存儲收入編号*/
private int ID;
/**存儲收入金額*/
private double Money;
/**存儲收入時間*/
private String Time;
/**存儲收入類型*/
private String Type;
/**存儲輸入備注資訊*/
private String Marks;

/**預設構造函數*/
public TB_InAccount() {
// TODO Auto-generated constructor stub
super();
}
/**自定義有參構造函數*/
public TB_InAccount(int ID,double Money,String Time,String Type,String Marks){
super();
this.ID=ID;
this.Money=Money;
this.Time=Time;
this.Type=Type;
this.Marks=Marks;
}
//利用source生成下面的get和set方法(每一個變量兩種方法)
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public double getMoney() {
return Money;
}
public void setMoney(double money) {
Money = money;
}
public String getTime() {
return Time;
}
public void setTime(String time) {
Time = time;
}
public String getType() {
return Type;
}
public void setType(String type) {
Type = type;
}
public String getMarks() {
return Marks;
}
public void setMarks(String marks) {
Marks = marks;
}

}      

View Code

      3.建立資料庫中對某一個表的操作的類。包括增、删、查、改。(這裡可以隻建立自己需要的方法,對應在activity中的功能)

/** 對InAccount表上的所有資料操作 */
public class InAccountDB {
/** 聲明一個DBOPenHelper對象 */
private DBOPenHelper helper;
/** 聲明一個SQLiteDatabase對象 */
private SQLiteDatabase db;

/** 自定義有參數構造方法 */
public InAccountDB(Context context) {
// 初始化helper對象
helper = new DBOPenHelper(context);
}

/** 添加收入資訊 */
public void addInAccount(TB_InAccount tb_InAccount) {
// 初始化db對象
db = helper.getWritableDatabase();
// SQL語句執行添加操作
db.execSQL("insert into InAccount(ID,Money,Time,Type,Marks) values(?,?,?,?,?)",
new Object[] { tb_InAccount.getID(), tb_InAccount.getMoney(),
tb_InAccount.getTime(), tb_InAccount.getType(),
tb_InAccount.getMarks() });
}

/** 更新收入資訊 */
public void updateInAccount(TB_InAccount tb_InAccount) {
// 初始化db對象
db = helper.getWritableDatabase();
// SQL語句執行更新操作
db.execSQL(
"update InAccount set Money=?,Time=?,Type=?,Marks=? where ID=?",
new Object[] { tb_InAccount.getID(), tb_InAccount.getMoney(),
tb_InAccount.getTime(), tb_InAccount.getType(),
tb_InAccount.getMarks() });
}

/** 查詢收入資訊 */
public TB_InAccount findInAccount(int ID) {
// 初始化db對象
db = helper.getWritableDatabase();
// 初始化光标對象
// 建議SQLite操作使用rawQuery方法
// 參考http://www.pin5i.com/showtopic-sqlite-rawquery.html
// 根據ID查詢收入資訊,存入Cursor類中
Cursor cursor = db.rawQuery(
"select ID,Money,Time,Type,Marks from InAccount where _id = ?",
new String[] { String.valueOf(ID) });
if (cursor.moveToNext())// 周遊查找到的收入資訊
{
// 将周遊到的收入資訊存儲到tb_InAccount類中
return new TB_InAccount(cursor.getInt(cursor.getColumnIndex("ID")),
cursor.getDouble(cursor.getColumnIndex("Money")),
cursor.getString(cursor.getColumnIndex("Time")),
cursor.getString(cursor.getColumnIndex("Type")),
cursor.getString(cursor.getColumnIndex("Marks")));
}
return null;
}

/** 删除收入資訊 */
public void deleteInAccount(Integer[] IDs) {
if (IDs.length > 0) {
// 建立StringBuffer對象
StringBuffer sb = new StringBuffer();
// 周遊要删除的id集合
for (int i = 0; i < IDs.length; i++) { // 将删除條件添加到StringBuffer對象中
sb.append('?').append(',');
}
// 去掉最後一個“,“字元
sb.deleteCharAt(sb.length() - 1);
db = helper.getWritableDatabase();// 初始化SQLiteDatabase對象
// 執行删除收入資訊操作
db.execSQL("delete from InAccount where ID in (" + sb + ")",
(Object[]) IDs);
}
}

/**
* 擷取收入資訊
* 
* @param start起始位置
* @param count每頁顯示數量
*/
public List<TB_InAccount> getScrollData(int start, int count) {
// 建立集合對象
List<TB_InAccount> tb_InAccount = new ArrayList<TB_InAccount>();
// 初始化SQLiteDatabase對象
db = helper.getWritableDatabase();
// 擷取所有收入資訊
Cursor cursor = db.rawQuery("select * from InAccount limit ?,?",
new String[] { String.valueOf(start), String.valueOf(count) });
while (cursor.moveToNext())// 周遊所有的收入資訊
{
// 将周遊到的收入資訊添加到集合中
tb_InAccount.add(new TB_InAccount(cursor.getInt(cursor
.getColumnIndex("ID")), cursor.getDouble(cursor
.getColumnIndex("Money")), cursor.getString(cursor
.getColumnIndex("Time")), cursor.getString(cursor
.getColumnIndex("Type")), cursor.getString(cursor
.getColumnIndex("Marks"))));
}
// 傳回收入資訊表集合
return tb_InAccount;
}

/** 擷取收入資訊表總記錄數 */
public long getCount() {
// 初始化SQLiteDatabase對象
db = helper.getWritableDatabase();
// 擷取收入資訊的記錄數
Cursor cursor = db.rawQuery("select count(ID) from InAccount", null);
// 判斷Cursor中是否有資料
if (cursor.moveToNext()) { // 傳回總記錄數
return cursor.getLong(0);
}
// 如果沒有資料,則傳回0
return 0;
}

/*** 擷取收入資訊表最大編号 */
public int getMaxId() {
// 初始化SQLiteDatabase對象
db = helper.getWritableDatabase();
// 擷取收入資訊表中的最大編号
Cursor cursor = db.rawQuery("select max(ID) from InAccount", null);
// 通路Cursor中的最後一條資料
while (cursor.moveToLast()) {
// 擷取通路到的資料,即最大編号
return cursor.getInt(0);
}
// 如果沒有資料,則傳回0
return 0;
}
}      

View Code

  4.在addactivity類中添加對資料表的操作,因為我建立的表的字段中有時間,是以把時間對話框的也添加進去了;也涉及到ListView控件的使用

public class AddInaccount extends Activity {
// 建立日期對話框常量
protected static final int DATE_DIALOG_ID = 0;
// 建立4個EditText對象
EditText txtInMoney, txtInTime, txtMarks;
// 建立Spinner下拉清單
Spinner spInType;
// 儲存按鈕
Button SaveBtn;
// 取消按鈕
Button CancelBtn;
// 年月日
private int mYear;
private int mMonth;
private int mDay;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.addinaccount);
// 初始化變量
txtInMoney = (EditText) findViewById(R.id.txtInMoney);
txtInTime = (EditText) findViewById(R.id.txtInTime);
txtMarks = (EditText) findViewById(R.id.txtInMark);
spInType = (Spinner) findViewById(R.id.spInType);
SaveBtn = (Button) findViewById(R.id.btnInSave);
CancelBtn = (Button) findViewById(R.id.btnInCancel);
// 為時間文本框設定單擊監聽事件
txtInTime.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 顯示日期選擇對話框
showDialog(DATE_DIALOG_ID);
}
});
// 為儲存按鈕添加監聽事件
CancelBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// 設定金額文本框為空
txtInMoney.setText("");
// 為金額文本框設定提示
txtInMoney.setHint("0.00");
// 設定時間文本框為空
txtInTime.setText("");
// 為時間文本框設定提示
txtInTime.setHint("2014-11-23");
// 設定備注文本框為空
txtMarks.setText("");
// 設定類别下拉清單預設選擇第一項(下拉框中的字元串資訊存儲在addinaccount.xml中)
spInType.setSelection(0);
}
});
// 為取消按鈕添加監聽事件
SaveBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String strInMoney = txtInMoney.getText().toString();// 擷取金額文本框的值
if (!strInMoney.isEmpty()) {// 判斷金額不為空
// 建立InAccountDB對象
InAccountDB inaccountDB = new InAccountDB(AddInaccount.this);
// 建立Tb_inaccount對象
TB_InAccount InAccount = new TB_InAccount(inaccountDB
.getMaxId() + 1, Double.parseDouble(strInMoney),
txtInTime.getText().toString(), spInType
.getSelectedItem().toString(), txtMarks
.getText().toString());
inaccountDB.addInAccount(InAccount);// 添加收入資訊
// 彈出資訊提示
Toast.makeText(AddInaccount.this, "〖新增收入〗資料添加成功!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(AddInaccount.this, "請輸入收入金額!",
Toast.LENGTH_SHORT).show();
}

}
});
// 初始化Calendar月曆對象
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);// 擷取年份
mMonth = c.get(Calendar.MONTH);// 擷取月份
mDay = c.get(Calendar.DAY_OF_MONTH);// 擷取天數
// 顯示目前系統時間
updateDisplay();
}

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:// 彈出日期選擇對話框
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
}
return null;
}

// 使用OnDateSetListener監聽器設定系統時間對話框
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;// 為年份指派
mMonth = monthOfYear;// 為月份指派
mDay = dayOfMonth;// 為天指派
updateDisplay();// 顯示設定的日期
}

};
/** 自定義方法顯示系統時間 */
private void updateDisplay() {
// 顯示設定的時間
txtInTime.setText(new StringBuilder().append(mYear).append("-")
.append(mMonth + 1).append("-").append(mDay));
}

}      

View Code

        另外,自己在addinaccount.xml檔案中部署控件。我這個activity對應的xml檔案中,(對應建立的資料表),有四個TextView控件,一個ListView控件等等。

        這個不是主程式activity,是以在自己的AndroidManifest.xml也需要配置activity。當然最開始學的時候,可以直接在MainActivity中執行個體操作資料庫。

轉載于:https://www.cnblogs.com/xuanwei-qingfeng/p/4119588.html