A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 allen927 于 2015-10-30 21:07 编辑

同样的课程、老师、就业,更好的学习环境,更低的学习成本!
内地学员,选择长沙校区,靠谱!!!
报名热线:0731-85833115
  QQ  : 2355535415

android基础Day02(数据存储)


《 如果感觉今天的知识点都会了,可以直接做作业,来进行检测》


(了解)测试相关概念
一般软件在上线之前,都是需要进行反复测试,而且在大公司还有专门的测试部门。小公司可能就是程序自己来完成测试。
测试的分类:
1 是否有源码
  1.1 黑盒测试:18w(最高)  测试工具
  1.2 白盒测试:对所有的源码特别熟悉,对特定的代码进行测试:都是编程  --》高级程序员     20w

2 时间
  2.1 单元测试(程序员)
  2.2 模块测试(小组内部测试)
  2.3 集成测试(整个开发团队测试)
  2.4 系统测试 (专门的测试人员)
  2.5 回归测试  (专门的测试人员)
  程序员:写代码+bug (修复了bug好像比找到女朋友还开心)

3 压力
  3.1 猴子测试
  3.2 冒烟测试

技巧:
这个bug你个我复现一下。  fix up .
上午看youku   下午开始测   500开始提交bug   当天必须修复bug  加班   
所以开发中必须和测试人员很好的沟通,让自己的工作合理化。



(掌握)junit单元测试
  1 概念介绍
junit测试就是单元测试。        
对于业务逻辑代码进行测试,也就是对于service进行测试
测试目标:方法
1 测试方法的执行是否成功。
2 测试方法的返回值是否成功。(断言测试)

  2 执行步骤
执行单元测试:
1 导入测试库
2 配置测试启动类
3 写一个类继承AndroidTestCase


编写测试类的时候需要注意命名的规范



进入 一定要进入的是测试类
选择方法右击:run as  --> android junit test
清单文件的很多节点是有顺序的。

  3单独的测试工程
测试代码可以写在同一应用程序里面,也可以写一个单独的测试工程。
步骤:
1 new

2 选择要测试的工程

3 测试的配置文件会自动生成,只需要编写测试代码


(掌握)logcat使用
日志猫
:window系统的输出   
如果在android应用程序中打印日志,它不会在console控制台输出。而是在Logcat里面
程序是运行在android系统。


(掌握)android的文件系统
android文件系统   基于Linux  



linux 最牛x  安全      他的权限控件很好。
rwx:  
r:read 可读
w:write  可写
x:可执行

第一位:d   -    l
d:目录  
-:文件
l:指向


(掌握)数据存储的方式



(掌握)文件保存例子
android系统的根目录:/








(掌握)sd卡存储
sdcard的路径:/sdcard   /mnt/sdcard



面试题:
sdcard的路径随着系统的改变会变化 或者手机定制商也会修改。所有要多使用常量
获取sdcard的路径
判断sdcard是否存在




sdcard是需要权限的。
  cat 查看文件的内容

android 4.4 增加了权限:
sdcard读都是需要权限


(掌握)文件访问权限
android为了api的完整性。


打开文件
把数据写入文件
/data/data/包名/创建一个文件夹files   再在files文件夹里面创建对应的文件
mode:文件的操作模式

(掌握)android xml的描述
xml?
w3c公司提出的标准。xml:数据的存储    配置    网络间数据的传递
组成:标签   属性  。java  j2ee  
android:重新描述了xml  



(掌握)xml文件序列化
对象集合  --xml





         public void create(View v){
                try {
                        List<PersonInfo> infos = new ArrayList<PersonInfo>();
                        infos.add(new PersonInfo(1, "冠希哥", 32));
                        infos.add(new PersonInfo(2, "霆锋", 32));
                        //把对象集合变成xml
                        //xml序列化器
                        XmlSerializer serializer = Xml.newSerializer();//使用接口去接收一个真实的对象
                        FileOutputStream os = openFileOutput("persons.xml", Context.MODE_PRIVATE);
                        serializer.setOutput(os, "utf-8");//指定数据输出的路径
                        serializer.startDocument("utf-8", true);//文档的开始
                        serializer.startTag(null, "persons");//标签的开始
                        for(PersonInfo info:infos){
                                serializer.startTag(null, "person");
                                serializer.attribute(null, "id", info.id+"");//属性

                                //name
                                serializer.startTag(null, "name");
                                serializer.text(info.name);//文本节点
                                serializer.endTag(null, "name");
                                //age
                                serializer.startTag(null, "age");
                                serializer.text(info.age+"");
                                serializer.endTag(null, "age");

                                serializer.endTag(null, "person");
                        }
                        serializer.endTag(null, "persons");//标签的结束
                        serializer.endDocument();//文档的结束

                        os.close();//关流
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }
(掌握)xml文件解析

xml解析:dom:一次全部加载    dom4j    sax   基于事件  
pull 解析:基于事件   
模板代码
        public void parse(View v){
                List<PersonInfo> infos = null;
                PersonInfo info = null;
                try {
                        //获取解析器
                        XmlPullParser parser = Xml.newPullParser();
                        FileInputStream inputStream = openFileInput("persons.xml");
                        parser.setInput(inputStream, "utf-8");//把流设置给解析器
                        int eventType = parser.getEventType();//获取事件类型
                        while(eventType != XmlPullParser.END_DOCUMENT){//判断是否解析到了文档的结尾
                                switch (eventType) {
                                case XmlPullParser.START_TAG://标签的开始
                                        if("persons".equals(parser.getName())){//获取当前标签的名称
                                                infos = new ArrayList<PersonInfo>();
                                        }else if("person".equals(parser.getName())){
                                                info = new PersonInfo();
                                                int id = Integer.parseInt(parser.getAttributeValue(0));//获取属性
                                                info.id = id;
                                        }else if("name".equals(parser.getName())){
                                                String name = parser.nextText();//获取下一个文本节点的值
                                                info.name = name;
                                        }else if("age".equals(parser.getName())){
                                                int age = Integer.parseInt(parser.nextText());
                                                info.age = age;
                                        }
                                        break;
                                case XmlPullParser.END_TAG://标签的结束
                                        if("person".equals(parser.getName())){
                                                infos.add(info);
                                                info = null;
                                        }
                                        break;

                                default:
                                        break;
                                }
                                //继续往下解析
                                eventType = parser.next();
                        }
                        //打印日志
                        for(PersonInfo personInfo:infos){
                                Log.i(TAG, personInfo.toString());
                        }

                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
(掌握)sharedpreference 首选项
首选项:存储软件的配置信息。
window  ini
android  xml

1 自动登录  
2 聊天 信息来了 。。。  很小
首选项不能存在太多的信息。  特点:当程序运行首选项里面的数据会全部加载进内容

存储的是私有的数据,并且数据的形式是键值对。








(掌握)debug技巧
   一:直接断点调试
1 打断点:在一行代码的最前面双击 出现小圆
2 debug as
3 进入断点
  
动态的打断点   放行--》如果后面有断点--》进入下一个断点
最后一定要放行(该应用程序还是处于调试模式)
如果想停止调试 可以选择 图标

   二:动态的调试
原来应用程序是run as  执行   
只能调试没有执行的代码
1 打断点
2 进入device视图 选择要调试的进程  选择

断点调试必须要多练习,这个学习和开发中必备的技巧。


(掌握)查看Settings的源码  获取sdcard的大小
Settings :设置应用


必须要有源码 必须是对应的  4.0 -2.3(4.0设备的效果在2.3的源码里面查看是不正确的)   2.3  --2.3  
Android系统源码2个重要的目录:
框架层
上层应用所有的源

查看源码:最好是把对应项目的代码导入到Eclipse.

搜索 search File才可以
格式化  工具类

StatFs:对于硬盘空间的描述类

大家看源码。
通过search来找代码

   
(了解)sqilte数据库
嵌入式的数据库,体积小  功能强大
几十kb.  嵌入式设备上:计算器 手表   
iso:Sqlite数据库

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,但是主键只能是Integer类型的
Sqlite数据库一般要求主键是_id,当然也可以是id.

原来:数据库
安装一个数据库的软件。
android里面的数据库是由底层的sqilte.c代码来动态生成的。

(了解)sqilte3工具的使用

双加  --next ....
不要对其进行升级处理。
  
用来查看数据库的客户端

(掌握)android数据库的创建
android系统封装了一个类SqliteOpenHelper
工具类:

获取数据库对象


/**
* 数据库的工具类
* 一般:用单例模式
* 把构造方法私有化 ,对外要提供一个方法 获取其他实例
* @author apple
*
*/
public class MySqliteOpenHelper extends SQLiteOpenHelper {
        private static SQLiteOpenHelper mInstance;

        /**
         *
         * @param context  上下文  打开或者创建数据库
         * @param name  数据库的名字  要以.db结尾
         * @param factory  游标工厂:创建游标对象
         * @param version 数据库的版本号  如果版本号不同  执行onUpgrade()方法:数据库的升级
         */
        private MySqliteOpenHelper(Context context, String name,
                        CursorFactory factory, int version) {
                super(context, name, factory, version);
        }

        //对外提供的方法
        public static synchronized SQLiteOpenHelper getInstance(Context context){
                if(mInstance == null){
                        mInstance = new MySqliteOpenHelper(context, "wuhan06.db", null, 1);
                }
                return mInstance;
        }

        /**
         * 创建数据库里面的表 或者对表里面的数据执行初始化
         * 创建一张表:person   字段:id(不标准) 最好是使用_id     唯一标示     主键   自增     
         *                        name   
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
                 String sql = "create table person(_id integer primary key autoincrement,name text)";
         db.execSQL(sql);
        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }

}

创建表的语句
CREATE TABLE person (_id integer primary key autoincrement, name varchar(20))


(掌握)利用sql语句对数据库增删改查
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
        select * from person order by id desc
        select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where _id=10
删除语句:delete from 表名 where 条件子句。如:delete from person  where _id=10

作业:
1解析
使用pull解析器  oop  使用面向对象的思想。

2

新的Activity   RegisterActivity  extends Activity   
   onCreate(){
     setContentView();
  }  

激活Activity
Intent intent = new Intent();
intent.setClass(RegisterActivity.class);
startActivity(intent);

必须配置 清单配置
<activity android:name="....">

关闭:finish()方法

下载资源

Doc笔记
课程视频代码
作业视频代码




相关链接:
长沙中心--黑马双元课堂JAVA入学辅导班1期火爆开班啦!!!
长沙黑马程序员学习激情无限“吊炸天”
黑马程序员长沙校区生活圈,60秒搞定吃住学
http://bbs.itheima.com/thread-243108-1-1.html

36 个回复

倒序浏览
顶起!{:2_31:}
回复 使用道具 举报
微笑、守望 来自手机 中级黑马 2015-10-25 19:05:23
藤椅
基哥给力!顶起!
回复 使用道具 举报
来学习一下!!
回复 使用道具 举报
收藏了以后用
回复 使用道具 举报
赞,写的真是太好了
回复 使用道具 举报
kungege 来自手机 中级黑马 2015-11-6 07:30:59
7#
谢谢基哥分享,,,
回复 使用道具 举报
支持基哥!每日一顶!
回复 使用道具 举报
顶基哥.基哥的每次次发贴都能看到基哥有多用心啊...
回复 使用道具 举报
澤光有潤紅頭龜 来自手机 中级黑马 2015-11-7 22:26:42
10#
已带走 回帖易 拿币难
回复 使用道具 举报
666... haodongxi
回复 使用道具 举报
我还会回来的。
回复 使用道具 举报
看到了好东西果断顶
回复 使用道具 举报
bobo大王 来自手机 中级黑马 2015-11-9 23:17:35
14#
果然是好东西,值得收藏,赞一个
回复 使用道具 举报
精华帖不顶怎么行
回复 使用道具 举报
冯景超 来自手机 中级黑马 2015-11-10 08:45:47
16#
作者很用心阿
回复 使用道具 举报
每日一顶
回复 使用道具 举报
顶一下第一项
回复 使用道具 举报
每日一顶
回复 使用道具 举报
其实也看过别人的笔记,但是就是觉得基哥的笔记最经典,所有来来回回的看
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马