day 03データストレージとインタフェースの表示(2)

8989 ワード

テスト

  • ブラックボックステスト
  • 論理業務
  • をテストする
  • ホワイトボックステスト
  • 試験論理方法
  • 試験粒度による
  • メソッドテスト: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 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);
    // , -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.getColumnIndex("phone"); String money=cs.getColumnIndex(");String money=cs.getColumnIndex("money");//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////add(p);}
  • 集合中のデータをスクリーンLinearLayout=(LinearLayout)findViewById(R.id.ll)に表示する.for(Personp: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();