SQLite数据库 + ListView控件
SQLite数据库简介
SQLite是一个轻量级数据库,它最初是为嵌入式设计的,占用资源非常少,在内存中只需要占用
几百KB的存储空间。这也是Android移动设备采用SQLite数据库的最重要的原因之一。
SQLite数据库是尊守ACID的数据库特性。即A原子性、C一致性、I隔离性和D持久性。
同时SQLite还支持基本的SQL语言(创建表,删除表,增删改查数据),事务处理等功能。
SQLite没有服务器端之说,它通过db文件保存数据,该文件是跨平台,可以放在其它平台中使用。
在保存数据时,支持null,integer,real,text(无大小限制)和blob这五种数据类型。但实际上,
SQLite也可以接收varchar数据类型,只不过在运算或保存时会转换成对应的五种数据类型,
这也是SQLite数据库的最大特点。
SQLite数据库文件有大小限制吗?
答:看版本,有限制
在 windows 和 unix 下,版本 2.7.4的 sqlite 可以达到 2的41次方字节 (2t 字节)。老版本的为 2的31 次方字节(2g 字节)。
sqlite 版本 2.8 限制一个记录的容量为 1m。sqlite 版本 3.0 则对单个记录容量没有限制。
体验一下在window中使用SQLite数据库
打开CMD窗口,依次输入以下命令:
》C:>cd E:\Android-Tools\adt-bundle-windows-x86_64-20140702\sdk\platform-tools
》C:>E:
》E:>sqlite3 itcast.db
》sqlite>create table users(id integer primary key autoincrement,
name text not null,
sex text not null);
》sqlite>.tables
》sqlite>insert into users(name,sex) values('哈哈','男');
》sqlite>insert into users(name,sex) values('呵呵','男');
》sqlite>select * from users;
》sqlite>.mode column
》sqlite>select * from users;
》sqlite>.exit
上述产生的itcast.db数据库文件,位于E:\Android-Tools\adt-bundle-windows-x86_64-20140702\sdk\platform-tools目录下
SQLite数据库的使用
SQLite操作API
为了方便使用SQLite数据库,Android SDK提供了一系列对数据库进行操作的类和接口,它们分别是:
1——SQLiteOpenHelper类,用于创建数据库和数据库版本更新
SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version)
构造方法,传递一个以db为扩展名数据库名称name和版本号version,
版本号最小为1,只升不降
onCreate():如果没有数据库文件时就调用该方法创建表;如果有数据库文件时就不调用该方法
onUpgrade():如果数据库文件版本更新时就调用该方法;如果数据库文件版本没有更新则不调
getReadableDatabase():创建或打开一个只读数据库,常用于查询操作
getWriteableDatabase():创建或打开一个读写数据库,常用于非查询操作
2——SQLiteDatabase类,用于访问数据库的类,可以进行增删改查操作
Insert():增加一条记录
Query():查询一条或多条记录
Update():更新一条记录
Delete():删除一条记录
rawQuery(String sql):执行一条可带有占位符的SQL语句,适用于查询操作
execSQL(String sql):执行一条可带有占位符的SQL语句,适用于增删改操作
close():关闭数据库,即相当于关闭IO流,释放资源
3——Cursor接口,是一个游标,在查询数据库时用到
moveToNext():移动光标到下一行
getInt():获取指定列的整型值
getString():获取指定列的字符串值
moveToFirst():移动光标到第一行
getCount():返回Cursor中的行数
close():关闭游标
SQLite常用操作
增:addWithSQL()和addWithMethod()
改:updateWithMethod()
删:deleteWithMethod()
查一:findByIdWithMethod()
查多:findAllWithSQL()和findAllWithMethod()
SQLite事务操作
事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,
同一个事务的操作具备同步的特点,即如果一条语句执行失败,那么所有语句都不执行失败。
SQLiteDatabase类中常用的事务API如下:
1——beginTransaction():事务开始
2——setTransactionSuccessful():设置事务成功标志
3——endTransaction():结束事务,如果有成功标志,则提交事务;否则撤销/回滚到事务开始之前
最后一定要关闭数据库
sqlite3工具
在Android开发中,使用真机进行测试无法进入data目录(只有获取Root权限的手机才行),
所以也无法直接操作应用程序下的数据库。为了解决这个问题,SQLite数据库为开发者提供
了一个sqlite3.exe工具,通过这个工具可以在不进入data目录下,直接操作数据库。
sqlite3.exe是一个简单的SQLite数据库管理工具,位于Android SDK/platform-tools目录下,
使用前,必须先启动模拟器或者真实手机,再进入DOS命令行,依次输入以下命令:
1——adb shell 转入linux空间,不是window空间,因为模拟器位于linux操作系统上
2——cd data/data
3——cd cn.itcast.db
4——ls
5——cd databases
6——ls
7——sqlite3 itcast.db 使用sqlite3命令操作itcast数据库
8——select * from users; 书写基本的SQL语句
5.3 ListView控件
5.3.1 ListView控件的使用
当一个页面中,需要展示多个条目时,且这些条目的布局相同,那么Android中提供了一个控件
来解决这个问题,它就是ListView控件。以下是ListView在布局文件中的代码片段:
android:id=”@+id/lvListView”
android:layout_width=”match_parent”
android:layout_height=”match_parent”/>
ListView是一个列表视图,由很多Item条目组件,每个Item条目的布局相同,
注意一定要为ListView定义一个id属性,才会在图形化视图中看到效果。
常用数据适配器
ListView是一个列表视图,但没有数据显示是没有意义的,Android提供一个适配器Adapter对
ListView进行数据适配,即可以将适配器理解为数据填充器或数据绑定器,为ListView列表视图
提供用于显示的数据。List数据-à适配器àListView/GridView/Spinner等
1——BaseAdapter:是抽象类,最基本的数据适配器,填充器,绑定器,通常要继承该类,重写方法
getCount():得到条目Item的总数
getView():得到相应postion对应的条目Item视图,postion当前条目Item的位置,从0开始
getItem():根据postion得到某个条目Item,可省
getItemId():根据position得到某个条目Item的id号,可省
2——ArrayAdapter:是BaseAdapter是子类
ArrayAdapter(Context context,int resource,int textViewResourceId,T[] objects):
参数一:Context对象,一个Android应用一个Context对象,表示该应用的全局环境对象
参数二:条目Item布局的资源id
参数三:条目Item布局中相应TextView控件的id
参数四:需要适配/填充/绑定的数据,数组类型
注意:只限于Item布局中是TextView的控件
3——SimpleAdapter:是BaseAdapter是子类
SimpleAdapter (Context context,Map,int resource,String[],int[]):
参数一:Context对象,一个Android应用一个Context对象,表示该应用的全局环境对象
参数二:为所有Item布局填充的值
参数三:条目Item布局的id
参数四:Map集合中的key,例如:new String[]{“photo”,”name”}
参数五:Item布局相应控件的id,例如:new int[]{R.id.photoImageView,R.id.nameTextView},
与参数四的key一一对应,不能错位
注意:只限于Item布局中是TextView,ImageView,或实现了Checkable接口的的控件,例如
CheckBox控件就实现了Checkable接口,所有它的作用范围也有限,但比ArrayAdapter
较好一些。