標籤:沒有 context protect 資料庫檔案 ast set help 元素 prim
測試
- 黑箱測試
白盒測試
根據測試粒度
- 方法測試:function test
- 單元測試:unit test
- 整合測試:integration test
- 系統測試:system test
根據測試暴力程度
- 煙霧測試 (Smoke Test):smoke test
- 壓力測試:pressure test
單元測試junit
定義一個類繼承AndroidTestCase,在類中定義方法,即可測試該方法
在指定指令集時,targetPackage指定你要測試的應用的包名
<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.itheima.junit"></instrumentation>
定義使用的類庫
<uses-library android:name="android.test.runner"></uses-library>
斷言的作用,檢測運行結果和預期是否一致
- 如果應用出現異常,會拋給測試架構
SQLite資料庫
建立資料庫
//建立OpenHelper對象MyOpenHelper oh = new MyOpenHelper(getContext(), "person.db", null, 1);//獲得資料庫物件,如果資料庫不存在,先建立資料庫,後獲得,如果存在,則直接獲得SQLiteDatabase db = oh.getWritableDatabase();
- getWritableDatabase():開啟可讀寫的資料庫
- getReadableDatabase():在磁碟空間不足時開啟唯讀資料庫,否則開啟可讀寫資料庫
在建立資料庫時建立表
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 cv = new ContentValues();cv.put("name", "劉能");cv.put("phone", 1651646);cv.put("money", 3500);//傳回值是改行的主鍵,如果出錯返回-1long i = db.insert("person", null, cv);
刪除
//傳回值是刪除的行數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[]{"趙四"});
查詢
//arg1:要查詢的欄位//arg2:查詢條件//arg3:填充查詢條件的預留位置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);}
事務
把資料庫的資料顯示至螢幕
- 任意插入一些資料
- 定義業務bean:Person.java
讀取資料庫的所有資料
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);}
把集合中的資料顯示至螢幕
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
- 就是用來顯示一行一行的條目的
- MVC結構
- M:model模型層,要顯示的資料 ————people集合
- V:view視圖層,使用者看到的介面 ————ListView
- c:control控制層,操作資料如何顯示 ————adapter對象
- 每一個條目都是一個View對象
BaseAdapter
必須實現的兩個方法
第一個
//系統調用此方法,用來獲知模型層有多少條資料@Overridepublic int getCount() { return people.size();}
第二個
//系統調用此方法,擷取要顯示至ListView的View對象//position:是return的View對象所對應的資料在集合中的位置@Overridepublic 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() { //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[]{ "趙帥哥", "趙師哥", "趙老師", "侃哥"};//true表示對應位置的選項被選了final boolean[] checkedItems = new boolean[]{ true, false, false, false,};builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() { //點擊某個選項,如果該選項之前沒被選擇,那麼此時isChecked的值為true @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基礎總結(三)