Xml:解析(可扩展表记语言)
标记:成对出现,大小写区分
标记的表示:对内容的描述
解析方式:
1.Dom:文档对象模型
将XML所有的内容全部载入内存,随机读取
缺点:占用内存,当文档非常大时
1.DocumentBuilderFactory
2.DocumentBuilder
3.Document
DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf。newDocumentBuilder();
Document doc =db.parse(file);
Element root =doc.getDocumentElement();
NodeList bookList =root.getChildNodes();
接口:Document
getDocumentElement();:Element
取得文档中根元素
接口:Node
getChildNodes();
返回节点中的子节点
getTextContent():标记之间包含的值
getNodeName();String;
NodeList:
item(Index):Node
SimpleAdapter adapter = newSimpleAdapter{context(上下文),data(要显示的数据),resouce(显示布局),from(显示key名),to(显示控件的ID)};
2.SAX:简单--只读只进--对文档不做修改---事件驱动::当遇到相应节点,触发事件,,事件处理由程序员完成
所有处理由程序员完成
顺序读取
优点:占用内存小,
缺点:不灵活(只能按顺序读)
实现接口:ContentHandler
DefaultHandler--实现了接口的类
自定义自己实现类继承DefaultHandler
startDocument
startElement--遇到开始节点
endElement--遇到结束
endDocument
characters:节点间内容
问题:List<Book>
3.PULL:
1.事件的类型--getEventType():int
START_DOCUMENT--表开始
END_DOCUMENT--表结束
START_TAG --标记,元素,节点开始
END_TAG--标记结束
2.读取下一个元素--next():int
3.读取内容:nextText():String返回的内容
有内容:if(name.equals("author")){
String content = parser.nextText();
}
处理过程:
1.解析器:(xml工具类)
XmlPullParser parser = Xml.newPullParser();
2.用输入流方式解析Xml:
InputStream imputStream = new FileInputStream(" ");
3.读取节点,事件类型
4.switch()一一判断
5.next()读取下一个元素
返回所需的List,在UI中ListView中显示
Sql语句:(结构化查询语言)
数据库管理系统:(DBMS)
数据完整性
数据共享性
DDL:数据库定义语言--定义对象
Create:创建
create 数据库(createDatabases)
***create 表(表名)****
create table (表名)
(
列名 类型(长度) 约束,
列名 类型
)
约束:
主键:唯一标识记录的(primarykey 不可重复,不可为空)放在类型后面
自动编号autoincrement
外键:其他表中的主键在自身表中使用,如果其他表中未出现过的值,自身表中不 可出
create table Teacher
(
rid integer primary key autoincrement,
tname,
tid
);
create table Student
(
sid integer primary key autoincrement,
sname,
sage,
tid,
foreign key(tid) reference Teacher(tid)
);
create 存储过程
……
Drop:删除
drop table (表名);
DML:数据操纵语言--数据操作
select:选择
select * from 表名;
select 列名 from 表名 where 条件
指定列:select 列名,列名 from 位置
1.显示所有行所有列:
select * (或表中所有列的名字)from表名
2.选择部分信息,只需要某个(些)列
select 列名 from 表名;
3.如果显示信息不希望重复,distinct
select distinct 列名 from 表名;
4.选择全部列,部分的行
select * from 表名 where 行条件 and/or 条件;
逻辑运算符 and/or/ not/ in
between and……
5.模糊查询
%表示任意多个任意字符
select * from 表名 where 列名 like '*%';
_表示一个任意字符
select * from 表名 where 列名 like '*_';
6.统计:聚合函数
count (列名) max (列名) min(列名) avg(列名)sum()列名
对于数据进行统计,如果要分组统计,group by(和聚合函数一同使用)
group by 写在 where 后
select category,count(category) from book where cost>50group by category;
having 分组后结果中条件,having写在group by 后面
select category,count(category) from book where cost>50group by category having category=‘文学类’;
7.排序:放在最后
order by 列名
升序:asc(默认的)
降序:desc
order by cost;order by cost desc;
select * from book where cost>20 order by cost;
select category,sum(cost) from book gorp by category;
select category,sum(cost) from book gorp by category order bysum(cost);
顺序:select/from/ where/ group by/ having/ order by
8.多表查询:
内联:
select 表.列名 from 表,表2 where 两个表连接的条件 and 查询条件
select member_name,issue.book_code,category from book,mamber,issuewhere member.member_code = issue.member_code and book.book_code =issue.book_code and issue_date =
'2012-1-12';
select member_name,book_code,issue_date,return_date fromissue,member where member.member_code = issue.member_code;
select member_name,book_code,issue_date,return_date fromissue,member where member.member_code = issue.member_code and issue.member_code= 'M001';
select issue.book_code,category from book,issue whereissue.book_code = book.book_code and member_code = 'M001';
select * from 表名 where 列名 in/not in (范围);
insert:插入
insert into 表名(列名,列名) values(值1,值2);
列的个数与值的个数完全一致
插入一一对应
insert into 表名 values(值……);
没有指明列,说明表中所有的列
值的个数与表中定义的个数完全一致
update:修改
update 表名 set 列名=新值 where(行条件);
update 表名 set 列名=新值,列名=新值 where 行条件;
delete:删除
delete from 表名---删除表中所有数据
delete from 表名 where 行条件
DCL,TCL
数据类型:
integer,
float,
double,
decimal,
varchar(长度)--可变字符
char--(长度)
datatime
SQLite--轻量级
Integer,
real--实数float,double
null,
text--文本varchar/char
当使用数据类型,可以不指明数据是什么类型,自动转换
Android数据存储方式:
1.SharePreference:保存的数据类似于配置信息的格式一XML方式保存
Key_value
getXXX(String key,XXX default);XXX
editor();SharePreference.Editor
写入数据:
SharePreference中内部类 Editor
Clear();清空所有数据
putXXX(String key,XXX values)
commit()当Editor编辑完后,提交写入文件
使用:得到SharePreference实例
context.get SharePreference(String fileName,int mode);
MODE_PRIVATE只能本应用程序读写
MODE_WORLD_READABLE:其他应用程序可读
MODE_WORLD_WRITEABLE:其他应用程序可写
写入: 1 得到对象
This. get SharePreference(String fileName,int mode);
2得到编辑对象
SharedPreferences preferences=getSharedPreferences("test",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
SharedPreferences.Editor editor = preferences.edit();
3putXXX方法写入内存
String name=etName.getText()+"";
editor.putString("name", name);
4提交数据
editor.commit();
读出: 1得到对象
2读出
存储:\data\data\packname\shared_prefs|..xml
文件存储:
Android 上下文中(Context)
1.openFileInput(String name):FileInputStream;
2.openFileOutput(String name,int mode):FileOutputStream
3.mode:
MODE_APPEND 文件追加
其他应用程序可读可写文件
1.得到SharePreference实例,不是通过自身上下文
SD卡:
1.是否存在:Environment.getExternalageState();:String
Enviroment.MEDIA_MOUNTED
2.获取SD卡目录:
Java.io.file
Environment.getExternalStorageDirectory();File
3.路径:
file.getCanonicalPath()
事物特性:
1.原子性:事物的完整性,要么全部完整,要么全部不做
2.一致性:看到内部是一致的
3.独立性:(隔离性)
4.持久性:永久存储
连接数据库-----文件
SQLiteDataBase----代表数据库
Static openOncreateDatabase(……)打开或者创建一个数据库
真正创建数据库,在第一次使用表
execSQL(String sql)--创建表,删除表,插入表,修改表
查询---rawQuery(String sql,String[] args):Cursor
Cursor—----结果集
ContentProvider不同的应用程序之间进行数据交换
标准API
Uri形式对外提供数据
Insert,update,delete,query。
ContentResolver:---- 提出请求uri(网址)
Content.GetContentProvider():
1.自定义一个ContentProvider 子类继承ContentProvider
2. AndroidMainfest.mxl注册----起域名
如果产生ContentProvider对象,直接请求所有的注册的ContentProvider
onCreat()
http://www.google.com.hk
协议//域名
Android url:
Content://authority/数据资源
工具类:公开Uri
公开表中的列名
UriMatcher:工具类:实际要完成的工作,由子类匹配
addURI(,数据资源,code) 注册uri资源
match(uri):int 返回资源编号
1. 自定义已个Provider,继承与ContentProvider
2.在AndroidMainfest.mxl注册----起域名authorities
3.在自定义的Provider中使用UriMatcher,注册内部Uri,使资源和编码相对应
4.完成insert,update,delete,query方法(重写)
5.提供一个工具类-----公开Uri
ContactContract.Contacts.CONTENT_URI 联系人
ContactContract.Contacts.CommonDataKinds.Phone.CONTENT_URI
线程:
Thread:start()---自动调用thread中的方法run()
主线程:UI线程Activity
子线程中不能够修改主程序View
子线程与主线程通信,中间对象传递数据
Handler:
Message
What:int
Arg1:int
Arg2:int
Obj:
setDate(date):
handler.sendEmptyMessage(int);子线程没有任何内容传递给主线程
handler.sendMessage(Message);子线程有内容放在msg中传递给主线程
接收:
handleMessage(Message):如果没有内容传递
如果有定义的线程运行处理
1.继承于Thread重写Run()方法
2.实现Runable接口 handlerMessage用于接收子线程消息的
主线程中不要处理耗时的工作-----否则没有响应、异常,主线程将关闭
主线程事件
只有主线程才能更改UI界面,主线程调用handleMessage()修改界面
Thread thread = new Thread(new Runnavle){});
Thread Handler
MyAsycnTask extendsAsycnTask<Integer,Integer,String>
在主线程中认为启动(execute()),工作只做一次
子线程在后台运行,子线程完成工作后,可讲结果返回给主线程
doInBackground 后台完成的cn.com.iotek工作
读取网络文件
网络连接
从数据库读取内容
从文件中读取一行显示到ListView
泛型:
1. 后台运行所需参数的类型,后台运行时,可变数组
2. 后台运行进度的类型
3. 完成工作后返回结果的类型
完成工作:
1.Params此参数的个数可以是0-N,整形数据
2.return 泛型中所指定的返回类型
2D绘图
基于Canvas
1. 继承与View,产生自己的空间view
2. 重写onDraw()方法,显示过程中自动调用的方法
Canvas:画布
DrawXXX(……)
Paint:画笔
setColor(int)设置颜色
setStyle(Style)设置风格
setTextSize(float)设置字体大小
setAntiAlias(boolean)设置是否抗锯齿
setShader(Shader)设置填充风格
setStrokeWidth(float)边框宽度
基于View绘图的限制:缺少了双缓冲机制
当程序需要更新View图像时,必须全部重绘
SurfaceView绘图:
SurfaceHolder:
surfaceView.getHolder:SurfaceHolder
surfaceHolder.lockCanvas():Canvas:锁定画布
surfaceHolder.unlockCanvasAndPost(canvas):解锁提交画布
去生成自定义的控件:
继承于SurfaceView,实现SurfaceHolder.CallBack接口
1. 得到一个SurfaceHolder对象,添加addCallBack(…)监听者
2. 得到后台的Canvas
3. 通过CallBack中surfaceCreate使控件在创建时直接显示绘制内容
SurfaceView可在子线程中直接更新内容,双缓冲机制,绘制不在主线程中,
动画元素比较多,定时控制动画元素
不希望全部刷屏
//避免被下一次lockCanvas遮盖
holder.lockCanvas(new Rect(0, 0, 0, 0));
holder.unlockCanvasAndPost(canvas);
Drawable:
动画:
Frame:----帧动画
1. 列出所有的图片---Xml文件,放在资源下面/res/anim
<animation-list>
<item android:drawable = “”android:duration=“”/>
</ animation-list >
2. 动画启动放映
AnimationDrawable:得到对象
Image.getBackground():Drawable 强转为AnimationBackground
start() stop()
Tween :补间动画
开始帧---------结束帧(中间的由计算机补)
Animation 动画类(抽象类)
AlphaAnimation---透明度0-1
ScaleAnimation 缩放 X-Y 1 0
RotateAnimation 旋转 角度,360°
TranslateAnimation 位移
格式,动画资源。Xml
1.放在anim文件下
<set>
<slpha
Android:fromAlpha=””
Android:toAlpha=””
Android:duration=””>
</set>
AnimationUtils.loadAnimation:加载动画
Image.startAnimation(…);
布局动画:
1.动画资源
2.有一个与布局关联Xml媒介文件
Anim
<layoutAnimation
Android:delay=”..%”
Android:animationOrder=”reverse”
Android:animation= “@anim/动画资源”/>
3.在控件中加入
Android:layoutAnimation=”@/anim/媒介文件”
视图动画(自定义动画)
继承与Animation产生子类
Initialize(初始化)---可设置是否延迟,运行速度……
完成变换
applyTransformation(float,Transformation t);
得到变换器:Matrixmatrix = t.getMatrix();
Matrix.setScale(interploatedTime,interploatedTime);
Super.applyTransformation(interploatedTime,t);
图片
res/drawable/../
动画图片
res/anim/
GET:数据以首部传输
POST:以主题传输
Service-----ConnectivityManager
getSystemService
得到ConnectivityManager对象:
ConnectivityManager CM = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActivityworkInfo();
访问网络资源:
URL————统一资源定位器,指向网络中资源的指针
Protocol://host:port/resourceName
http://www.baidu.com
htttp://192.168.11.8:8080/TestWeb/
URI…………
getFile():String 资源名
getHost():String 主机名
getPath();String
getPort():int
getPortocol():String
getQuery():String 查询字符串
openConnection():URLConnection
openStream():InputStream
如果需要访问网络资源……加授权
URLConnection……与应用程序与URL之间通信连接
可发送请求,读取资源
1. 创建URL对象
2. 通过openConnection()得到URLConnection
URLConnection conn =url.openConnection();
3. 发出请求:
a. GET 使用connect()方法
conn.connect();
b. POST 首先对应的输出,放入主体,发送请求
setDoOutput();
setDoInput();
HttpURLConnection
URLConnection子类
增加了用于操作HTTP资源方法
getResponseCode():int 获取服务器的响应代码
HttpClient:
1. 创建HttpClient对象
2. 创建HttpGet对象
3. 设置参数
4. HttpClient执行execute(get):HttpResponse
getEntity()
WebView
1. 控件……所有的控件都是派生于View
View ViewGroup
.mxl 布局
<控件名
Android:layout-width
Android:id
/>
View.setLayoutParams(…)
onCreate(){
TextView tv = new TextView();
addView(tv);
ctl.setText(...);了解属性、方法、时间-----API
}
Eg:
CheckBox chk;
Chk.ischecked(是否被选中,一般以 .is..开头)
标签:TextView
按钮:Button
图像:ImageView
字段:EditView
复选框:CheckBox
单选框:RadioButton
重点和难点:ListView
选择控件ListView,Spinner,GridView,
适配器:
ArrayAdapter:
SimpleAdatper:
SimpleCursorAdapter:
BaseAdapter:
getView做显示-----要重写
适配器的优化:
持有者模式:持有者类
findViewById(...);
class MyAdapter extends ArrayAdapter<>
重写构造方法
Public View getView(int position,ViewconverView—项视图,ViewGroup parent);
View row = converView;
If(row = null)---得到控件,即重新加载
Else 通过持有者得到控件
菜单:记得在activity中重写上下文菜单