數據存儲和界面展示(二)

#測試

  • 黑盒測試

    • 測試邏輯業務

  • 白盒測試

    • 測試邏輯方法

  • 根據測試粒度

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

#把數據庫的數據顯示至屏幕

  1. 任意插入一些數據

  • 定義業務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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458958.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux在A目錄下創建B文件,Linux課程---5、常用文件命令和目錄命令(創建文件命令)...

Linux課程---5、常用文件命令和目錄命令(創建文件命令)一、總結一句話總結&#xff1a;touch file11、管道符|有什么用&#xff1f;將前一個命令的結果作為后一個命令的輸入&#xff1a;比如查看文件前3行&#xff1a;cat file1 | head -32、linux下如何復制粘貼命令是什么&…

window 系統上傳文件到linux 系統出現dos 格式換行符

Windows里的文件在Unix/Mac下打開的話&#xff0c;在每行的結尾可能會多出一個^M符號&#xff0c;Unix/Mac系統下的文件在Windows里打開的話&#xff0c;所有文字會變成一行&#xff0c;所以為了避免這種情況的發生&#xff0c;我們可以在linux系統內轉換格式 Centos系列可以直…

#pragma once與 #ifndef的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 為了避免同一個文件被include多次 1 #ifndef方式2 #pragma once方式 在能夠支持這…

android學習者優秀網址推薦

非常漂亮的android UI庫集合&#xff0c;別人整理的&#xff0c;如果感覺不錯&#xff0c;趕快收藏吧&#xff01;&#xff01; https://github.com/wasabeef/awesome-android-ui https://github.com/Trinea/android-open-project android中文社區網 http://www.android-studio…

linux while read文件,linux shell腳本用while read逐行讀取文本的問題

問題:我現在是想用一個腳本獲取一定列表服務器的運行時間。首先我建立一個名字為ip.txt的IP列表(一個IP一行)&#xff0c;再建好密鑰實現不用密碼直接登錄。然后寫腳本如下&#xff1a;#!/bin/bashwhile read ips;doecho $ips;done < ip.txt腳本實現了逐行讀取列表中的IP&am…

常用字符串處理函數匯總

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** (一)strcmp函數 strcmp函數是比較兩個字符串的大小,返回比較的結果。一般形式是&…

兼容性記錄-class屬性

getAttribute獲得class屬性時,IE6,IE7的傳參是className,IE7和現代游覽器都是class全部游覽器DOMElement均有的className屬性,其在IE各版本號下的均表現良好返回屬性class值的字符串此外html5中DOMElement有個classList屬性,它返回一個類型為DOMTokenList的對象,它當中有非常多…

magenta內核與linux,谷歌將推出新操作系統Fuchsia:Magenta語言為內核

谷歌現在研發出來并且推出使用的系統有Chrome OS、Android和Chromecasts&#xff0c;這三者在操作系統的市場中占得份額很高&#xff0c;但是好像谷歌對此并不滿意&#xff0c;因為有相關消息顯示&#xff0c;谷歌正在研發新的操作系統Fuchsia&#xff0c;該系統采用Magenta語言…

BZOJ 1968: [Ahoi2005]COMMON 約數研究 水題

1968: [Ahoi2005]COMMON 約數研究 Time Limit: 20 Sec Memory Limit: 256 MB 題目連接 http://www.lydsy.com/JudgeOnline/problem.php?id1968 Description Input 只有一行一個整數 N&#xff08;0 < N < 1000000&#xff09;。 Output 只有一行輸出&#xff0c;為整數M…

VC內存對齊準則(Memory alignment)

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 本文所有內容在建立在一個前提下&#xff1a;使用VC編譯器。著重點在于&#xff1a;VC…

[redis設計與實現][7]基本數據結構——對象

Redis對基礎數據類型進行了封裝&#xff0c;構建出上層的對象系統&#xff0c;這個系統包含&#xff1a;字符串對象、列表對象、哈希對象、集合對象和有序集合對象。 Redis對象結構&#xff1a; [cce lang”c”] typedef struct redisObject { //類型 unsigned type:4; //編碼 …

Linux中samba的權限詳解,活用三種權限 理解Samba的權限控制

在企業內網開發環境方面&#xff0c;文件服務器是一個非常重要的環節。在這當中&#xff0c;Samba服務器由于其權限控制的高度靈活性&#xff0c;在這里撫琴煮酒會進行一些列詳細的說明。之前我們已經介紹了Samba服務器一些入門和基本的更換用戶、端口監聽、列表控制等技巧&…

安卓基礎01

安卓基礎01SDK System images 這是在創建模擬器時需要的system image&#xff0c;也就是在創建模擬器時CPU/ABI項需要選擇的&#xff0c;下載并解壓后&#xff0c;將解壓出的整個文件夾復制或者移動到 your sdk 路徑/system-images文件夾下即可&#xff0c; 如果沒有 system-im…

C++存儲區域基礎概念詳解

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 以下詳解來自&#xff1a; http://blog.163.com/zb_075/blog/static/3734032820115110…

創建、修改、刪除表總結

一、創建表 CREATE TABLE <表名> &#xff08;<列名><數據類型>[列級完整性約束條件] [&#xff0c;<列名> <數據類型>[列級完整性約束條件]] … [&#xff0c;表級完整性約束條件]&#xff09;&#xff1b; 如果完整性約束條件涉及到該表的多個…

linux 編譯查看鏈接庫詳情,Linux環境下的編譯,鏈接與庫的使用

鏈接參數控制鏈接器中提供了-dn -dy 參數來控制使用的是動態庫還是靜態庫&#xff0c;-dn表示后面使用的是靜態庫&#xff0c;-dy表示使用的是動態庫例:g -Lpath -Wl,-dn -lx -Wl,-dy -lpthread 這樣如果在path路徑下有libx.so和libx.a這個時候只會用到 libx.a.注意在最后的地…

在C++中用虛函數的作用是什么? 為什么要用到虛函數?

***************************************************更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com***************************************************虛函數聯系到多態&#xff0c;多態聯系到繼承。所以本文中都是在繼承層次上做文章。沒了繼…

mysql 主主互備實現

今天星期天&#xff0c;么事就寫個MYSQL的主主架構的博客&#xff0c;原理如下圖&#xff0c;不是我畫的網上找的。主機作用操作系統mysql版本對應IPvip數據庫mysqlA(主)centos6.4mysql 5.5.48192.168.48.129192.168.48.126mysqlB(備)centos6.4mysql 5.5.48192.168.48.132一&am…

Linux Deepin 版本大全,Deepin下載-Deepin linuxv20.0 官方版下載-6188手游網

Deepin linux安裝準備一&#xff1a;為 Deepin 留出硬盤空間以便安裝。1.打開磁盤管理(Windows 徽標上右鍵單擊&#xff0c;選擇磁盤管理)。2.選中一個分區(空閑空間大于 30G)&#xff0c;我選擇的是 C 盤&#xff0c;因為是固態硬盤所以安裝啟動會快很多。磁盤 1 的 200G 分區…

動手實踐 Linux VLAN - 每天5分鐘玩轉 OpenStack(13)

本節我們來看如何在實驗環境中實施和配置如下 VLAN 網絡 配置 VLAN 編輯 /etc/network/interfaces&#xff0c;配置 eth0.10、brvlan10、eth0.20 和 brvlan20。 下面用 vmdiff 展示了對 /etc/network/interfaces 的修改 重啟宿主機&#xff0c;ifconfig 各個網絡接口 用 brct…