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()方法
下载资源
相关链接:
长沙中心--黑马双元课堂JAVA入学辅导班1期火爆开班啦!!!
长沙黑马程序员学习激情无限“吊炸天”