测试

  • 黑盒测试

    • 测试逻辑业务
  • 白盒测试

    • 测试逻辑方法
  • 根据测试粒度

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

把数据库的数据显示至屏幕

  1. 任意插入一些数据
  2. 定义业务bean:Person.java
  3. 读取数据库的所有数据

    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);
    }
  4. 把集合中的数据显示至屏幕

     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);
    }
  5. 分页查询

    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

  • 必须实现的两个方法

    • 第一个

      //系统调用此方法,用来获知模型层有多少条数据
      @Override
      public int getCount() {
      return people.size();
      }
    • 第二个

      //系统调用此方法,获取要显示至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方法获取第一个条目时,传入任意一个条目的缓存

对话框

确定取消对话框

  • 创建对话框构建器对象,类似工厂模式
  • 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();

Android基础总结(三)SQLite,ListView,对话框的更多相关文章

  1. android基础(三)ContentProvider

    ContentProvider主要用于在不同的应用程序之间实现数据共享,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性,目前内容提供其实android实现跨 ...

  2. 安卓Android基础第三天——数据库,ListView

    数据库介绍sqlite问:什么情况下使用数据库?答:有大量相似结构的数据需要存储的时候 数据库的创建定义一个类继承SqliteOpenHelpercontext:上下文name:数据库名字,如&quo ...

  3. Android初级教程三个Dialog对话框小案例

    这里把三个对话框形式写在一个项目程序里面,用三个按钮控制显示什么样式的对话框. 先看布局文件代码: <LinearLayout xmlns:android="http://schema ...

  4. Android基础------高级ul:消息对话框

    前言:Android消息对话框提示笔记,刚刚接触Android 1.经典模式 //列表对话框 //经典模式 public void listdialog_01(View view){ final St ...

  5. Android学习--持久化(三) SQLite & LitePal

    SQLite & LitePal 自己做为一个iOS开发,看到安卓这一块的时候,那中浓烈的熟悉味道更加强烈,SQLite这种轻量级的关系型数据库的使用在移动端相差不多,iOS有FMDB,And ...

  6. <Android 基础(三十五)> RecyclerView多类型Item的正确实现姿势

    简介 RecyclerView是我们开发过程中经常使用到的一个元素,原生的RecyclerView.Adapter基本上可以满足一般的需求,关于RecyclerView的基础介绍请移步: Recycl ...

  7. <Android 基础(三十四)> TabLayout 从头到脚

    1. 简介 1.TabLayout给我们提供的是一排横向的标签页 2.#newTab()这个方法来创建新的标签页,然后用过#setText()和#setIcon方法分别修改标签页的文本和图标,创建完成 ...

  8. <Android 基础(三十三)> TabHost ~ 仿微信底部菜单

    简介 Container for a tabbed window view. This object holds two children: a set of tab labels that the ...

  9. <Android 基础(三十二)> ViewFlipper

    简介 View Flipper,是ViewAnimator的子类,而ViewAnimator又是继承自FrameLayout,而FrameLayout就是平时基本上只显示一个子视图的布局,由于Fram ...

  10. <Android 基础(三十一)> ObjectAnimator

    简介 ObjectAnimator,是ValueAnimator的子类,支持利用目标视图的属性来实现动画效果.构造ObjectAnimator的时候,将会提取对应的参数来定义动画对象和对象属性.合适的 ...

随机推荐

  1. 解决Oracle监听错误的一种办法

    1:事出有因 安装oracle数据库,默认安装的是orcl数据库,安装完成后查看了一下字符集是gbk的,由于业务需要al32utf8的字符集,所以需要修改字符集,但是修改却无效.于是就删除了默认的or ...

  2. 【php】Apache无法自己主动跳转却显示文件夹与php无法连接mysql数据库的解决方式

    一.Apache无法自己主动跳转却显示文件夹 Apache无法自己主动跳转却显示文件夹这是由于Apacheserver下conf/httpd.conf没有配置好,其默认是不跳转,直接显示文件夹 首先, ...

  3. Netbeans配合xdebug调试

    http://xdebug.org/download.php 下载对应的xdebug的dll不知道php文件中的ext文件夹中 并且加入以下配置在php.info 然后重启apche zend_ext ...

  4. Html中的次方符号怎么写

    代码: <p>1.01<sup>365</sup>=37.783,0.99<sup>365</sup>=0.025</p> 效果 ...

  5. ZOJ 3630 Information 强连通

    题意:n m表示n个节点,m条边,下面m行a b 表示a-b点有一条有向边 题目:给定有向图,删去一个点后,可以求出该图中强连通分量中最大的点数 问:删去某点后,最大点数 最小是多少 思路:枚举删点, ...

  6. es6 - 回调深渊

    带着以下疑问来解答以下问题,你会学到很多 1. 回调深渊为什么会出现,为什么需要回调 ? 2. ES6为什么会出现Promise? 3. 回调的作用是什么? 跟闭包有关吗? ES5 ~ ES6 回调深 ...

  7. ‘close’ was not declared in this scope

    ‘close’ was not declared in this scope ‘read’ was not declared in this scope ‘sysconf’ was not decla ...

  8. oracle 两表关联查询

      oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...

  9. 记一次CurrentDirectory导致的问题

    现在项目里需要实现一个功能如下: A.exe把B.exe复制到临时目录,然后A.exe退出,B.exe负责把A.exe所在的整个目录删除. 实现: A.exe用CreateProcess创建B.exe ...

  10. 05-maven学习-构建web项目

    1,新增maven项目 然后输入相应包名,项目名,创建如下项目 发现以上有报错,需要进行如下操作: 下面文章转载自:http://blog.csdn.net/zhshulin/article/deta ...