sharePreference
非常适合保存零散数据
- SharedPreference ap =getSharedPreference("info",MODE_PRIVATE);
- String name = sp.getString("name","");
- String pass = sp.getString("pass","");
- sp.edit().putString("name","haha");
- et_name.setText(name);
- et_pass.setText(pass);
- //使用
- String n =et_name.getText().toString();
- String p = et_pass.getText().toString();
- 通常用于应用简单的配置信息!!!打勾。很方便
它是键值对保存形式,所以非常简单
Edit it= sp.edit();
ed.putString(“name”,name).commit();
ed.putString(“password”,password).commit();
使用XML序列化器生成xml文件
- //拿到序列化器生成xml对象
- XmlSerializer xs = Xml.serializer();
- //初始化
- FileOutputStream fos = new FileOutputStream("sdcard/sms.xml");
- //encoding:制定用什么编码生成xml文件
- xs.setOutput(fos,"utf-8");
- //开始生成xml文件,这个encoding:"utf-8"是xml头结点中的encoding的编码格式
- xs.startDocument("utf-8",true);
- xs.startTag(null,"message");
- xs.text(sms,"ssss");
- xs.endTag(null,"message");
- //告诉序列化器,文件生成完毕
- xs.endDocument();
pull解析
@H_301_27@测试
- //获取src文件夹下的资源文件
- InputStream is = getClassLoader().getResourceAsStream("weather.xml");
- //拿到pull解析器对象
- XmlPullParser xp = Xml.newPullParser();
- //初始化
- xp.setInput(is,"utf-8");
- //获取当前节点的事件类型,通过事件类型的判断,知道当前节点是何结点,从而确定我们应该做什么操作,每个类型结点都有一个固定的int值(0,1,2,3,4)
- int type = xp.getEventType();
- City city = null;
- //一直走,直到走到结束节点
- while(type !=XmlPullParser.END_DOCUMENT){
- //根据结点的类型,要做不同的操作
- switch(type){
- case ZXmlPullParser.START_TAG:
- if("weather".equals(xp.getName())){
- //创建city集合对象,用于存放city的javabean对象
- cityList = new ArrayList<City>();//全局声明
- }else if("city".equals(xp.getName())){
- //写一个city的javabean然后存储city的三个数据
- city = new City();//City city在成员变量处定义,这样可以全局引用
- }else id("name".equals(xp.getName())){
- //获取当前节点的下一个节点的文本
- String name = xp.nextText();
- city.setName(name);
- }else id("temp".equals(xp.getName())){
- //获取当前节点的下一个节点的文本
- String temp = xp.nextText();
- city.setTemp(temp);
- }else id("pm".equals(xp.getName())){
- //获取当前节点的下一个节点的文本
- String pm = xp.nextText();
- city.setPm(pm);
- }
- break;
- case ZXmlPullParser.END_TAG:
- if("city".equals(xp.getName())){
- //把city的javabean放入集合中
- cityList.add(city);
- }
- break;
- }
- //把指针移动到下一个节点,并返回该节点的事件类型
- type = xp.next();
- }
- 了解即可,有专门测试人员
按岗位划分
按测试粒度分
按测试的暴力程度分
- 冒烟测试:smoke test(高负荷运转)
- 压力测试:pressure test(针对服务器测试:20万个访问量)
单元测试
- junit
- 定义一个类继承自AndroidTestCase
需要在清单文件中定义指令集和类库(指令集只有一个)
*- <instrumentation
- //指令集
- android:name="android.test.InstrumentationTestRunner"
- //指定要测试的哪个项目
- android:targetPackage="测试项目的包名"
- ></instrumentation>
- //以上是和<applaction>属于同级节点的,写在其上方即可
- -------------------------------------------------
- //类库只有一个,根据提示
- <user-library
- android:name="android.test.runner"
- ></user-library>
- //注意,它的位置是位于<applaction>节点内,属于其子节点,跟<activity>是属于同级节点
*在类中写一个test方法,对test选中,然后Run As–> Android Junit Test
sqlite 内置的数据库(安卓数据库)
定义一个类,MyOpenHelper继承sqliteOpenHelper//打开帮助器
super(context,name,factory,version);//四个参数?
context:上下文;一般用MainActivity.this
||测试的时候用:getContext()获取虚拟的上下文;测试框架专用的
factory:游标工厂;父类是CursorFactory游标所在位置读取数据,移到下一行再读再移;通常传null,就是使用默认的游标工厂
verson:设置 数据库的版本号
重写两个方法:OnCreate():数据库创建时,此方法会调用;OnUpgrade():数据库升级时,此方法会调用
创建表
//主键是:_id;默认这样写,最好这样写;这个是创建一个person表,含有四个字段(id,姓名,工资,电话);id是主键,自增长!
db.execsql(“create table person(_id integer primary key autoincrement,phone integer(20))”);
//主键是:_id;默认这样写,最好这样写;这个是创建一个person表,含有四个字段(id,电话);id是主键,自增长!
sqlite:轻量级数据库,不检查数据类型;存入的都是字符串来保存的(所以不用定义类型,但定义类型是给程序员看的,用来表示它应该存储什么类型),但是定义好的类型,数据类型过于不一致,不会存储。
增加数据:insert();
删除数据 delete
修改数据 update
查询数据 select
- //创建一个对象
- MyOpenHelper oh = new MyOpenHelper(getContext(),1);
- //获取数据库对象
- sqliteDatabase db = oh.getWritableDatabase();
- Cursor cursor = db.rawQuery("select name,salary from person",null);
- //查询了两个字段,所以name索引是0,salary索引是1,索引和select name,salary顺序有关
- while(cursor.moveToNext()){
- //参数是要查询的数据的索引
- String name = cursor.getString(0);
- //上面写法有时容易混淆,所以还有一种方法查询name值,正式开发写下面这个
- //String name = cursor.getString(cursor.getColumnIndex("name"));
- String salary = cursor.getString(1);
- }
通过api来增删改(使用数据库代码进行增删改,不好调试,所以出现了api方法,线程封装好的方法)
- //把要插入的数据全部封装至ContentValues对象(第三个参数)
- ContentValues values = new ContentValues();//相当于map
- values.put("name","孙一一");
- values.put("phone","15999");
- values.put("salary",19999);
- db.insert("person",values);//第二个数据一般用不上,常写null
- //返回的是插入数据的行ID或者是主键;插入失败返回-1
- //用api删除数据
- db.delete("person","name = ? and _id=?",new String[]{"小志的儿子",3});
- //删除成功返回的是删除的行数(删了几行数据),返回-1则删除失败
- //用api修改数据
- ContentValues value = new ContentValues();
- value.put("salary",26000);//修改salary字段的值
- db.update("person",value,"name = ?",new String[]{"孙一一"});
- //返回值是被删除的行数,一行就是1,3行就是3;删除失败返回-1;
- //用api查询query
- //db.query("person",new String[]{"name","salary"},);
- //查询所有字段
- Cursor cursor = db.query("person",null);
- while(curor.moveToNext()){
- String name = cursor.getString(cursor.getColumnIndex("name"));
- String phone = cursor.getString(cursor.getColumnIndex("phone"));
- String salary = cursor.getString(cursor.getColumnIndex("salary"));
- System.out.println(name+";"+phone+";"+salary);
- }
由上看出,api的增删改都封装在了ContentValues类名!
sqlite之事物
保证所有sql语句要么一起成功,要么一起失败!(银行转账,转出,转入)
- try{
- //开启事物
- db .beginTransaction();
- ContentValues values = new ContentValues();
- values.put("salary",13000);
- db.update("person",values,new String[]{"小志"});
- //values.clear();//有时会携带前面的数据
- values.put("salary",15000);
- db.update("person",new String[]{"小志的儿子"});
- //设置 事物执行成功
- db.setTransactionSuccessful();
- //关闭事物,同时提交,如果已经设置事物执行成功,那么sal语句就生效了,反之sql语句回滚。
- }
- finally{
- db.endTransaction();
- }
数据库的数据取出,显示在UI上
- List<person> personList = new ArrayList<Person>();
- //把数据库的数据查询处出来
- MyOpenHelper oh = new MyOpenHelper(this,1);
- sqliteDatabase db = oh.getWritableDatabase();
- Cursor cursor = db.query("perosn",null);
- //先写一个javabean,Person类
- while(cursor.moveToNext()){
- String _id = cuisor.getString(0);
- String name =cuisor.getString(1);
- String phone=cuisor.getString(2);
- String salary=cuisor.getString(3);
- Person p = new Person(_id,phone,salary);
- personList.add(p);
- }
- ------------------------------------------------
- 查询:从第20行数据开始,读取到10条数据:最后一个null替换成要找的序列(开始位置,读取数据)
- Cursor cursor = db.query("perosn","20,10")
JSON解析的三种解析方式
JSON、GSON、FASTJSON
get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
构建json文本;获取值;- 案例:
- JSONObject,JSONArray来构建json文本
- 1. // 首先最外层是{},是创建一个对象
- 2. JSONObject person = new JSONObject();
- 3. // 第一个键phone的值是数组,所以需要创建数组对象
- 4. JSONArray phone = new JSONArray();
- 5. phone.put("12345678").put("87654321");
- 6. person.put("phone",phone);
- 7.
- 8. person.put("name","yuanzhifei89");
- 9. person.put("age",100);
- 10. // 键address的值是对象,所以又要创建一个对象
- 11. JSONObject address = new JSONObject();
- 12. address.put("country","china");
- 13. address.put("province","jiangsu");
- 14. person.put("address",address);
- 15. person.put("married",false);
- 还可以使用JSONStringer来构建json文本
- 1. JSONStringer jsonText = new JSONStringer();
- 2. // 首先是{,对象开始。object和endObject必须配对使用
- 3. jsonText.object();
- 4.
- 5. jsonText.key("phone");
- 6. // 键phone的值是数组。array和endArray必须配对使用
- 7. jsonText.array();
- 8. jsonText.value("12345678").value("87654321");
- 9. jsonText.endArray();
- 10.
- 11. jsonText.key("name");
- 12. jsonText.value("yuanzhifei89");
- 13. jsonText.key("age");
- 14. jsonText.value(100);
- 15.
- 16. jsonText.key("address");
- 17. // 键address的值是对象
- 18. jsonText.object();
- 19. jsonText.key("country");
- 20. jsonText.value("china");
- 21. jsonText.key("province");
- 22. jsonText.value("jiangsu");
- 23. jsonText.endObject();
- 24.
- 25. jsonText.key("married");
- 26. jsonText.value(false);
- 27.
- 28. // },对象结束
- 29. jsonText.endObject();
getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException
- optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值
- 1. // 所有使用的对象都是用上面创建的对象
- 2. // 将第一个电话号码转换为数值和将名字转换为数值
- 3. phone.getLong(0);
- 4. person.getLong("name"); // 会抛异常,因为名字无法转换为long
- 5. phone.optLong(0); // 代码内置的默认值
- 6. phone.optLong(0,1000); // 用户提供的默认值
- 7. person.optLong("name");
- 8. person.optLong("name",1000); // 不像上面那样抛异常,而是返回1000
- 9. } catch (JSONException ex) {
- 10. // 异常处理代码
- 11. }
json文本解析类JSONTokener
- 按照RFC4627规范将json文本解析为相应的对象。
- 对于将json文本解析为对象,只需要用到该类的两个api:
- 构造函数 public Object nextValue();