安卓黑马教学(三)

来源:互联网 发布:cmm软件内涵 编辑:程序博客网 时间:2024/05/19 02:29

一,数据库介绍

sqlite

问:什么情况下用数据库   有大量相似结构的数据需要存储的时候



二,数据库创建

定义一个类继承sqliteOpenHelper

注意:当new那个实现了数据库帮助类的时候,并没有创建一个数据库,只有用这个对象调用了getWritableDatabase方法之后数据库才会被创建/打开数据库。

getReadableDatabase()也可以创建数据库/打开数据库。

两者返回的对象是一样的,调用第二种方法,如果磁盘满了,则返回一个只读的数据库对象。


三,数据库的onCreate和onUpgrade方法

onCreate ---》数据库第一次创建的时候执行,特别使用做表的初始化

【1】使用SQLite Expert Professional这个工具来打开我们创建的数据库(图形化界面)

注意:sqlite里边的数据类型实际上都是用string来存储的,不管你sql写的是什么类型,它为的是提高运行效率。

onUpgrade---》数据库版本升级的时候调用,一般用作修改数据库的表。而且版本号只能升不能降。


四,使用sql语句进行增删改查

缺点1:sql语句容易写错

缺点2:执行sql语句之后没有返回值,不容易进行判断是否执行成功

优点:可以进行多表查询

使用命令行工具sqlite3可以打开数据库

改变dos的编码方式  chcp 936就可以变成gbk编码,chcp  65001可以把编码变成utf-8



五,使用谷歌封装好的api对数据库执行增删改查

优点:写法简单,不需要写复杂的sql语句,不容易写错,而且还有返回值

缺点:如果有多张表,使用谷歌的api不容易进行查询


六,2种增删改查的优缺点


七,安卓中数据库事物的介绍

事务:执行一段逻辑,要么同时成功,要么同时失败。(银行转账)


在以上代码中,张三的钱减少了100,然后程序发生错误,这100块没有到李四上。这个时候,就给当前事务设置了一个失败的标记,那么,张三减少的100块钱也会回到张三的账号。



八,listview入门

安卓下一个非常重要的控件。安卓中任何的控件都是一个view。一个listview里边有许多item,item来自于listAdpaer。

【1】定义listview  在布局中

【2】定义listview 的数据适配器

【3】实现baseAdapter的getCount方法和getView方法





数据适配器:

BaseAdapter---》

方法:

getCount()----》返回item的个数

getItem()---》返回指定位置对应的对象

getItemId()---》返回位置对应的id

getView()----》获取一个view,用来显示listview数据,会作为listview的一个条目

注意:最后一个方法,只有显示出来的条目才会调用。

例如:一共有1000个条目,但是一页只能显示20条,也就是说这个getView方法只执行了20次,当你往下拉的时候,才会继续调用此方法。


九,listview的优化

有时候条目的个数太多,就会出现内存溢出的异常。  Out of momory on a 108-byte allocation


当快速拖动条目的时候,就会创建了很多TextView对象,因为我们在创建模拟器的时候,规定了每个程序的占有内容大小,虽然有gc垃圾回收机制,但是,回收的速度慢于新创建对象的速度,所以就有了内存溢出的问题。


第二个参数  converView。一个缓冲的view对象,当对象没有显示出来,就作为历史缓冲对象,也就是converView。


代码解析:只有在第一次创建的时候,才创建新对象,但是当上边的第一条条目被遮挡之后,新出来的条目不会创建新的对象,自会调用之前被遮挡之后的对象。


也就是说,一次性只创建出屏幕能显示出来的对象,之后的都是引用那些之前创建好的对象。

可以在listview布局那里设置一个fastScrollEnabled属性,设置一个快速滑动条。



十,listview显示数据的原理

   mvc,就是javaweb的设计模式。


javaweb:

m:mode  数据

v:view   视图 jsp

c:controller  控制器 servlet


安卓:

m:mode  数据(javabean)

v:view  listview

c:adapter   适配器


listview的奇怪现象:当高是充满父控件(match_parent)的时候,getView方法看有多少个条目就执行多少次,而高是包裹内容(wrap_content)的话,则会重复多次调用,就会造成效率低下。

因为,如果是充满父控件,则listview就可以计算出来可以显示出多少个条目从而调用多少次的getView方法,而如果是包裹内容,则不知道内容的大小是多少,就不能计算出显示多少条条目,确定不了。从而做了多少调试。

注意:高只能用match_parent。如果用了包裹内容,则高就不确定了,listview就需要做多次校验,所以效率低下。



十一,listview显示复杂的页面

线性布局,相对布局都继承自ViewGroup。


第三个参数为null,此参数可以设置转换之后的view控件添加到一个布局之中,此参数就是布局的名字。

通过一个打气筒可以把一个布局转换成一个view对象



十二,获取打气筒(inflate)常用的api


第三种用得最多。因为谷歌工程师提供的API之中都是使用这种写法。


十三,arrayAdapter使用

如果只是简单的显示一些文本内容,则可以使用此适配器。


第三参数表示具体用哪个控件来显示文本内容。



权重的概念

主要在线性布局中使用,在相对布局中使用会出现警告。


十四,simpleAdapter使用

 构造方法--》

第一个参数:上下文对象

第二个参数:一个map的list集合

第三个参数:item的布局文件名字

第四个参数:map的健名称

第五个参数:负责显示内容的view控件的id


baseAdapter是用得最多的。



十五,把数据库里边的数据查询出来,展示到listview上。


注意,findViewById是在当前的Activity布局下查找的,这两个文本都是在item布局中,所以直接调用findViewById是找不到文本控件的,要通过使用打气筒转换成view对象来调用此方法。




原创粉丝点击