日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据存储和界面展示(二)

發布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据存储和界面展示(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#測試

  • 黑盒測試

    • 測試邏輯業務

  • 白盒測試

    • 測試邏輯方法

  • 根據測試粒度

    • 方法測試: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();

    轉載于:https://www.cnblogs.com/jesonjason/p/5305328.html

    總結

    以上是生活随笔為你收集整理的数据存储和界面展示(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。