一,数据库介绍
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对象来调用此方法。