データストレージとインタフェースの展示(二)

9962 ワード

#テスト#テスト#
  • ブラックボックステスト
  • 論理業務
  • をテストする
  • ホワイトボックステスト
  • 試験論理方法
  • 試験粒度による
  • メソッドテスト:function test
  • ユニットテスト:unit test
  • 統合テスト:integration test
  • システムテスト:system test
  • 暴力の程度をテストすることによって
  • 発煙試験:smoke test
  • 圧力試験:pressure test

  • #ユニットテストjunit
  • クラス継承Android TestCaseを定義し、クラスでメソッドを定義すると、このメソッド
  • をテストできます.
  • 命令セットを指定すると、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 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 personset 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);
      // , -1
      long 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
  • は、1行1行のエントリを表示するための
  • である.
  • MVC構造
  • M:modelモデルレイヤ、表示するデータ--peopleセット
  • V:viewビューレイヤ、ユーザが見るインタフェース--ListView
  • c:control制御層、操作データの表示方法--adapterオブジェクト
  • 各エントリは、Viewオブジェクト
  • です.
     
    ###BaseAdapter
     
  • が実装しなければならない2つの方法
  • 最初の
      // , 
      @Override
      public int getCount() {
          return people.size();
      }
    
  • 第2の
      // , ListView View 
      //position: return View 
      @Override
      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メソッドを呼び出して最初のエントリを取得すると、任意のエントリのキャッシュ
  • が転送される可能性がある.
    #ダイアログ
    ###OKキャンセルダイアログ
  • ダイアログボックスビルダーオブジェクトを作成します.ファクトリモード
  • と似ています.
  •   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();