测试

  • 黑盒测试

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

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

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

黑马--数据存储与界面展现2相关推荐

  1. Android应用开发:数据存储和界面展现-1

    1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:l ...

  2. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  3. Android应用开发:数据存储和界面展现-2

    1. pull解析XML文件 Android推荐使用pull解析XML文件,与SAX解析XML文件类似,都是事件驱动类型的解析方式. 示例:获取天气信息 res\layout\activity_mai ...

  4. Android应用开发-数据存储和界面展现

    测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...

  5. 数据存储和界面展现之二

    测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...

  6. Android(三)----数据存储和界面展现02

    Pull解析xml文件(掌握) 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(&q ...

  7. Android-应用开发-数据存储和界面展现(三)

    测试 按岗位划分 黑盒测试:测试逻辑业务 白盒测试:测试逻辑方法 按测试粒度分 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试 ...

  8. 数据存储和界面展现总结

    测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...

  9. 数据存储和界面展示(一)

    ##常见布局 ###相对布局 #####RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRightOf="@id/tv1& ...

最新文章

  1. 【JS 逆向百例】反混淆入门,某鹏教育 JS 混淆还原
  2. c语言中输入字符用什么作用是什么意思,C语言编程问题
  3. linux strace cpu,如何定位死循环或高CPU使用率(linux)
  4. Shell排序(改良的插入排序)
  5. javascript入门之私有变量
  6. redis-LinkedList
  7. Windows系统镜像、PE系统下载地址大全
  8. samba 指定的网络名不再可用
  9. c语言转换绝对值函数的程序,c语言abs(c语言求绝对值的程序)
  10. Python实现Excel表格数据去重
  11. java isnull方法_isnull函数详解
  12. 生僻字用计算机的歌词,生僻字歌词翻译成常用汉字 陈柯宇生僻字歌曲翻译谐音版...
  13. 涛思数据库(二)——上手使用
  14. 完美破解StartUML软件
  15. VuePress 博客之 SEO 优化(一) sitemap 与搜索引擎收录
  16. 中国企业NAS行业市场供需与战略研究报告
  17. 【2023考研数学】学习规划
  18. 为什么 LR 模型要使用 sigmoid 函数,背后的数学原理是什么?
  19. 单片机STC8H入门
  20. 模糊PID(重心法解模糊梯形图FC)

热门文章

  1. 使用大淘客接口获取产品数据
  2. python 情绪分析_借助Python进行情绪和情感分析
  3. FVM in CFD 学习笔记_第9章_梯度计算
  4. CC2640 片外OAD 内部FLASH结构与OAD过程
  5. Android下的多线程下Handler的使用
  6. html中隐藏div的高度,jQuery如何获取隐藏元素的高度?
  7. matlab在一个坐标系内让二维图片堆叠形成三维空间的表示
  8. 修改linux硬时钟,Linux 下用 hwclock 调节系统时钟
  9. Mac使用npm install报错,需使用sudo
  10. IBM最好的办法不应该是卖掉PC - 我对联想收购IBM的看法。