#測試
-
黑盒測試
-
測試邏輯業務
-
-
白盒測試
-
測試邏輯方法
-
-
根據測試粒度
-
方法測試:function test
-
單元測試:unit test
-
集成測試:integration test
-
系統測試:system 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數據庫
-
輕量級關系型數據庫
-
創建數據庫需要使用的api:SQLiteOpenHelper
-
必須定義一個構造方法:
//arg1:數據庫文件的名字//arg2:游標工廠//arg3:數據庫版本public MyOpenHelper(Context context, String name, CursorFactory factory, int version){}
-
數據庫被創建時會調用:onCreate方法
-
數據庫升級時會調用:onUpgrade方法
-
###創建數據庫
//創建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 stubdb.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);}
###事務
-
保證多條SQL語句要么同時成功,要么同時失敗
-
最常見案例:銀行轉賬
-
事務api
try {//開啟事務db.beginTransaction();...........//設置事務執行成功db.setTransactionSuccessful();} finally{//關閉事務//如果此時已經設置事務執行成功,則sql語句生效,否則不生效db.endTransaction();}
#把數據庫的數據顯示至屏幕
-
任意插入一些數據
-
定義業務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() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "恭喜你自宮成功,現在程序退出", 0).show();}});builder.setNegativeButton("下次再說", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubToast.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表示點擊的是哪一個選項@Overridepublic 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@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {checkedItems[which] = isChecked;}});builder.setPositiveButton("確定", new OnClickListener() {@Overridepublic 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();