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 个回复

正序浏览
资源很详细,必须顶起
回复 使用道具 举报
赞基哥,笔记超级不错!!!!
回复 使用道具 举报
赞一个,笔记很详细!!!!
回复 使用道具 举报
很棒不错,赞赞赞
回复 使用道具 举报
很详细,顶基哥!!!!!!!!!!!!!
回复 使用道具 举报
很实用赞一个,谢谢基哥............
回复 使用道具 举报
有代码插入,谢谢基哥!!!!!
回复 使用道具 举报
需要掌握的知识点分析很详细,顶一个....
回复 使用道具 举报
实用,谢谢分享....
回复 使用道具 举报
很实用,谢谢
回复 使用道具 举报
yuchifeifan 来自手机 中级黑马 2016-2-20 00:58:22
27#
我给32个赞 这才是值得加精的
回复 使用道具 举报
基哥,这天的有个知识点有些疑惑,请你解答下http://bbs.itheima.com/forum.php ... p;page=1#pid2249182
回复 使用道具 举报
每日一签
回复 使用道具 举报
之后的课程就靠基哥了~!
回复 使用道具 举报
加油,基哥,你是好样的
回复 使用道具 举报
前来提前学习
回复 使用道具 举报
为长沙校区点赞
回复 使用道具 举报
其实也看过别人的笔记,但是就是觉得基哥的笔记最经典,所有来来回回的看
回复 使用道具 举报
每日一顶
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马