標籤:
SQLite資料庫
// 自訂類MyOpenHelper繼承自SQLiteOpenHelperMyOpenHelper oh = new MyOpenHelper(getContext(), "person.db", null, 1);// 獲得資料庫物件,如果資料庫不存在,先建立資料庫,後獲得;如果存在,則直接獲得SQLiteDatabase db = oh.getWritableDatabase();
getWritableDatabase():以讀寫的方式開啟資料庫對應的SQLiteDatabase對象,磁碟空間不足時會報錯
getReadableDatabase():該函數首先調用getWritableDatabase(),如果磁碟空間不足,會返回開啟失敗,然後以唯讀方式開啟資料庫對應的SQLiteDatabase對象
在建立資料庫時建立表
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table person (_id integer primary key autoincrement, name char(10), phone char(20), money integer(20))");}
資料庫的增刪改查
SQL語句
insert into person (name, phone, money) values (‘張三‘, ‘159874611‘, 2000); delete from person where name = ‘李四‘ and _id = 4; update person set money = 6000 where name = ‘李四‘; select name, phone from person where name = ‘張三‘;
執行SQL語句實現增刪改查
db.execSQL("insert into person (name, phone, money) values (?, ?, ?);", new Object[]{"張三", 15987461, 75000});// 插入Cursor cs = db.rawQuery("select _id, name, money from person where name = ?;", new String[]{"張三"}); // 尋找
測試方法執行前會調用此方法
protected void setUp() throws Exception { super.setUp(); // 擷取虛擬內容物件 oh = new MyOpenHelper(getContext(), "people.db", null, 1);}
使用API實現增刪改查
插入
// 把要插入的資料以索引值對的形式封裝至ContentValues對象ContentValues cv = new ContentValues();cv.put("name", "劉能");cv.put("phone", 1651646);cv.put("money", 3500);long i = db.insert("person", null, cv); // 傳回值是所插入行的主鍵,如果出錯返回-1
刪除
int i = db.delete("person", "_id = ? and name = ?", new String[]{"1", "張三"}); // 傳回值是刪除的行數
修改
ContentValues cv = new ContentValues();cv.put("money", 25000);int i = db.update("person", cv, "name = ?", new String[]{"趙四"}); // 傳回值是所修改行的主鍵,如果出錯返回-1
尋找
//arg2:要查詢的欄位//arg3:查詢條件//arg4:填充查詢條件的預留位置Cursor cs = db.query("person", new String[]{"name", "money"}, "name = ?", new String[]{"張三"}, null, null, null);while(cs.moveToNext()){ //擷取指定列的索引值 String name = cs.getString(cs.getColumnIndex("name")); String money = cs.getString(cs.getColumnIndex("money")); System.out.println(name + ";" + money);}
事務
保證多條SQL語句要麼同時成功,要麼同時失敗
最常見案例:銀行轉賬
事務API
try { //開啟事務 db.beginTransaction(); ........... //設定事務執行成功 db.setTransactionSuccessful();} finally{ //關閉事務 //如果此時已經設定事務執行成功,則sql語句生效,否則不生效 db.endTransaction();}
把資料庫的資料顯示至螢幕
1. 任意插入一些資料
2. 定義業務bean:Person.java
3. 讀取資料庫的所有資料
Cursor cs = db.query("person", null, null, null, null, null, null);while(cs.moveToNext()){ String name = cs.getString(cs.getColumnIndex("name")); String phone = cs.getString(cs.getColumnIndex("phone")); String money = cs.getString(cs.getColumnIndex("money")); //把讀到的資料封裝至Person對象 Person p = new Person(name, phone, money); //把person對象儲存至集合中 people.add(p);}
4. 把集合中的資料顯示至螢幕
LinearLayout ll = (LinearLayout) findViewById(R.id.ll); for(Person p : people){ //建立TextView,每條資料用一個文字框顯示 TextView tv = new TextView(this); tv.setText(p.toString()); //把文字框設定為ll的子節點 ll.addView(tv); }
分頁查詢
Cursor cs = db.query("person", null, null, null, null, null, null, "0, 10");
ListView
LsitView用來顯示一行一行的條目
MVC架構
M:model模型層,要顯示的資料 ————people集合
V:view視圖層,使用者看到的介面 ————ListView
C:control控制層,操作資料如何顯示 ————adapter對象
每一個條目都是一個View對象
BaseAdapter
必須實現的兩個方法
第一個
//系統調用此方法,用來獲知模型層有多少條資料public int getCount() { return people.size();}
第二個
//系統調用此方法,擷取要顯示至ListView的View對象//position:是return的View對象所對應的資料在集合中的位置public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView方法調用" + position); TextView tv = new TextView(MainActivity.this); //拿到集合中的元素 Person p = people.get(position); tv.setText(p.toString()); //把TextView的對象返回出去,它會變成ListView的條目 return tv;}
螢幕上顯示多少條目,getView方法就會被調用多少次,當向下滑動螢幕時,getView會繼續被調用,建立更多的View對象顯示至螢幕
條目的緩衝
當條目划出螢幕時,系統會把該條目緩衝至記憶體,當該條目再次進入螢幕,系統在重新調用getView時會把緩衝的條目作為convertView參數傳入,但是傳入的條目不一定是之前被緩衝的該條目,即系統有可能在調用getView方法擷取第一個條目時,傳入任意一個條目的緩衝
對話方塊
確定取消對話方塊
建立對話方塊構建器對象,類似原廠模式
AlertDialog.Builder builder = new Builder(this);
設定標題和本文
builder.setTitle("警告");builder.setMessage("若練此功,必先自宮");
設定確定和取消按鈕
builder.setPositiveButton("現在自宮", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "恭喜你自宮成功,現在程式退出", 0).show(); }});builder.setNegativeButton("下次再說", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "若不自宮,一定不成功", 0).show(); }});
使用構建器建立出對話方塊對象
AlertDialog ad = builder.create();ad.show();
單選對話方塊
AlertDialog.Builder builder = new Builder(this);builder.setTitle("選擇你的性別");
定義單選選項
final String[] items = new String[]{ "男", "女"};//-1表示預設誰也不選中//點擊偵聽的導包要注意別導錯builder.setSingleChoiceItems(items, -1, new OnClickListener() { //dialog:觸發這個方法的對話方塊 //which:使用者所選的條目的下標 @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "您選擇了" + items[which], 0).show(); //關閉對話方塊 dialog.dismiss(); }});//可以直接用構建器顯示對話方塊builder.show();
多選對話方塊
AlertDialog.Builder builder = new Builder(this);builder.setTitle("請選擇你覺得帥的人");
定義多選的選項,因為可以多選,所以需要一個boolean數組來記錄哪些選項被選了
final String[] items = new String[]{ "吳彥祖", "吳亦凡", "劉德華", "古天樂"};//預設只選中第一個條目final boolean[] checkedItems = new boolean[]{ true, false, false, false,};builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() { //which:使用者點擊條目的下標 //isChecked:用於判斷使用者點擊該條目是選中還是取消 @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { checkedItems[which] = isChecked; }});//設定一個確定按鈕builder.setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuffer sb = new StringBuffer(); for(int i = 0;i < items.length; i++){ sb.append(checkedItems[i] ? items[i] + " " : ""); } Toast.makeText(MainActivity.this, sb.toString(), 0).show(); }});builder.show();
Android應用開發-資料存放區和介面展現(二)(重製版)