加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

解析及SQLite

发布时间:2020-12-12 19:36:36 所属栏目:百科 来源:网络整理
导读: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

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解析

//获取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();
}

测试

  • 了解即可,有专门测试人员

按岗位划分

  • 黑盒测试:测试逻辑业务(不懂代码的)
  • 白盒测试:测试逻辑方法(懂代码的)

按测试粒度分

  • 方法测试:function test
  • 单元测试:unit test(多个方法测试)
  • 集成测试:integration test(能否交换数据)
  • 系统测试:system test

按测试的暴力程度分

  • 冒烟测试: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

class myTest extends AndroidTestCase{
    public void test(){
        //写代码
        System.out.println("测试框架跑起来了");
        //断言:用来检测实际值与期望值是否一致
        assertEquals(期望值,实际值);
    }
}
//测一个方法一个test,下一个test2

SqLite 内置的数据库(安卓数据库)

定义一个类,MyOpenHelper继承SQLiteOpenHelper//打开帮助器

super(context,name,factory,version);//四个参数?

context:上下文;一般用MainActivity.this
||测试的时候用:getContext()获取虚拟的上下文;测试框架专用的

name:数据库的名称

factory:游标工厂;父类是CursorFactory游标所在位置读取数据,移到下一行再读再移;通常传null,就是使用默认的游标工厂

verson:设置 数据库的版本号

重写两个方法:OnCreate():数据库创建时,此方法会调用;OnUpgrade():数据库升级时,此方法会调用

创建表

//拿到序列化器生成xml对象
db.execSQL("create table person(_id integer primary key autoincrement,name char(10),salary char(20),phone integer(20))");

//主键是:_id;默认这样写,最好这样写;这个是创建一个person表,含有四个字段(id,姓名,工资,电话);id是主键,自增长!

db.execSQL(“create table person(_id integer primary key autoincrement,phone integer(20))”);
//主键是:_id;默认这样写,最好这样写;这个是创建一个person表,含有四个字段(id,电话);id是主键,自增长!

SQLite:轻量级数据库,不检查数据类型;存入的都是字符串来保存的(所以不用定义类型,但定义类型是给程序员看的,用来表示它应该存储什么类型),但是定义好的类型,数据类型过于不一致,不会存储。

增加数据:insert();

//创建一个对象
MyOpenHelper oh = new MyOpenHelper(getContext(),"people.db",null,1);    
//获取数据库对象
SQLiteDatabase db = oh.getWritableDatabase();
例子: 
db.execSQL("insert into person (name,salary,phone)values(?,?,?))",new Object[]{'小志','13000','13838383838'});
db.close();

上述?是占位符,后面对占位符进行填充。

删除数据 delete

//创建一个对象
MyOpenHelper oh = new MyOpenHelper(getContext(),1);
//获取数据库对象
SQLiteDatabase db = oh.getWritableDatabase();
db.execSQL("delete from person");删除person所有数据
db.execSQL("delete from person where name= ?",new Object[]{"小志"});

db.close();

修改数据 update

//创建一个对象
MyOpenHelper oh = new MyOpenHelper(getContext(),1);
//获取数据库对象   
SQLiteDatabase db = oh.getWritableDatabase();
db.execSQL("update person set phone = ? where name = ?",new Object[]{18666,"小志的儿子"});   
db.close;

查询数据 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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读