1、第第7 7章章 AndroidAndroid中的数据存取中的数据存取 在Android平台上,嵌入了一个轻量级的关系型数据库SQLite。SQLite并没有包含大型客户/服务器数据库(如Oracle、SQL Server)的所有特性,但它包含了操作本地数据的所有功能,简单易用、反应快。SQLite内部只支持 NULL、INTEGER、REAL(浮点数)、TEXT(字符串文本)和BLOB(二进制对象)这五种数据类型,但实际上SQLite也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成上面对应的数据类型。SQLite最大的特点是可以把各种类
2、型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以把字符串类型的值存入INTEGER类型字段中,或者在布尔型字段中存放数值类型等。但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。由于SQLite允许存入数据时忽略底层数据列实际的数据类型,因此SQLite在解析建表语句时,会忽略建表语句中跟在字段名后面的数据类型信息。create table person_tb(id integer primary key autoincrement,name varchar(20),因此在编写建表语
3、句时可以省略数据列后面的类型声明。查询语句:select*from 表名 where 条件子句 group by 分组字句 having.order by 排序子句 如:select*from person分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录 select*from Account limit 5 offset 3 插入语句:insert into 表名(字段列表)values(值列表)。如:insert into person(name,age)values(张三,26)更新语句:update 表名 set 字段名=值 where 条件子句。如:updat
4、e person set name=李四 where id=10删除语句:delete from 表名 where 条件子句。如:delete from person where id=10常见SQL标准语句7.3.1 SQLiteSQLite数据库简介数据库简介 SQLiteOpenHelper是Android提供的管理数据的工具类,主要用于数据库的创建、打开和版本更新。一般用法是创建SQLiteOpenHelper类的子类,并扩展它的onCreate()和onUpgrade()方法(这两个方法是抽象的,必须扩展),选择性的扩展它的onOpen()方法。SQLiteDatabase getR
5、eadableDatabase():以读写的方式打开SQLiteDatabase对象,内部调用getWritableDatabase()方法;SQLiteDatabase getWritableDatabase():以写的方式打开SQLiteDatabase对象,一旦打开成功,将会缓存该数据库对象;abstract void onCreate(SQLiteDatabase db):当数据库第一次被创建的时候调用该方法;abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):当数据库需要更新的时候调用该方法
6、;调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取SQLiteDatabase实例,如果数据库不存在,Android系统会自动生成一个数据库,然后调用onCreate()方法,在onCreate()方法里生成数据库表结构及添加应用需要的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,数据库的版本是由开发人员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目
7、的,可以把数据库版本设置为2,并在onUpgrade()方法里实现表结构的更新。onUpgrade()方法可以根据原版本号和目标版本号进行判断,然后作出相应的表结构及数据更新。7.3.2 SQLiteSQLite数据库相关类数据库相关类 SQLiteDatabase是Android提供的代表数据库的类(底层就是一个数据库文件),该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作。对SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。execSQL()
8、方法可以执行insert、delete、update和create table之类有更改行为的SQL语句;而rawQuery()方法用于执行select语句。execSQL(String sql,Object bindArgs):执行带占位符的SQL语句,如果sql语句中没有占位符,则第二个参数可传null;execSQL(String sql):执行SQL语句;rawQuery(String sql,String selectionArgs):执行带占位符的SQL查询。7.3.2 SQLiteSQLite数据库相关类数据库相关类 SQLiteDatabase还专门提供了对应于添加、删除、更新
9、、查询的操作方法:insert()、delete()、update()和query()。例如:Cursor query(String table,String columns,String selection,String selectionArgs,String groupBy,String having,String orderBy,String limit)方法各参数的含义table:表名,如果是多表联合查询,可以用逗号将两个表名分开;columns:要查询的列名,可以是多列。selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?
10、”。selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。groupBy:相当于select语句group by关键字后面的部分having:相当于select语句having关键字后面的部分orderBy:相当于select语句order by关键字后面的部分,如:personid desc,age asc;limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。Cursor接口主要用于存放查询记录的接口,Cursor是结果集游标,用于对结果集进行随机访问,如果熟悉JDBC,可发现
11、Cursor与JDBC中的ResultSet作用很相似,提供了如下方法来移动查询结果的记录指针。move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就向下移动,为负数就向上移动;moveToNext()方法可以将游标从当前记录移动到下一记录,如果已经移过了结果集的最后一条记录,返回结果为false,否则为true;moveToPrevious()方法用于将游标从当前记录移动到上一记录,如果已经移过了结果集的第一条记录,返回值为false,否则为true;moveToFirst()方法用于将游标移动到结果集的第一条记录,如果结果集为空,返回值为false,否则
12、为true;moveToLast()方法用于将游标移动到结果集的最后一条记录,如果结果集为空,返回值为false,否则为true。7.3.2 SQLiteSQLite数据库相关类数据库相关类使用SQLiteDatabase进行数据库操作的步骤如下:获取SQLiteDatabase对象,它代表了与数据库的连接;调用SQLiteDatabase的方法来执行SQL语句;操作SQL语句的执行结果;关闭SQLiteDatabase,回收资源。7.3.2 SQLiteSQLite数据库相关类数据库相关类 该程序实现备忘录功能,用于记录生活中一些重要事情,并提供查询功能,可按条件进行模糊查询。可输入主题、相
13、关内容以及选择时间,单击添加按钮时,会将相关数据写入数据库,单击查询按钮时,会根据主题、内容以及时间进行精确和模糊查询。7.3.2备忘录实例备忘录实例程序清单:Mementoreslayoutactivity_main.xml 垂直线性布局表格布局,3行2列左边距10dp显示主题标签文本大小为20sp输入主题的文本编辑框7.3.2备忘录实例备忘录实例 程序清单:Mementoreslayoutactivity_main.xml7.3.2备忘录实例备忘录实例 程序清单:Mementoreslayoutactivity_main.xml7.3.2备忘录实例备忘录实例程序清单:Mementoresl
14、ayoutactivity_main.xml 需要动态设置属性,所以添加ID水平线性布局引用定制好的样式设置TextView的宽度将颜色设置为黑色7.3.2备忘录实例备忘录实例 程序清单:Mementoreslayoutactivity_main.xml此布局使用了样式,程序清单:Mementoresvaluesstyles.xml wrap_content center_horizontal 18sp#0000ff 7.3.2备忘录实例备忘录实例 下面为添加和查询两个按钮添加事件处理,所有的数据都已具备,如何将数据写入数据库了,首先写一个自己的数据库工具类,该类继承于SQLiteOpenHe
15、lper,并重写它的onCreate()和onUpdate()方法,数据库创建时,会调用onCreate()方法,因此,我们将建表语句放在里面,详细代码如下:public class MyDatabaseHelper extends SQLiteOpenHelper final String CREATE_TABLE_SQL=create table memento_tb(_id integer primary +key autoincrement,subject,body,date);public MyDatabaseHelper(Context context,String name,Cu
16、rsorFactory factory,int version)super(context,name,factory,version);public void onCreate(SQLiteDatabase db)db.execSQL(CREATE_TABLE_SQL);public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)System.out.println(-+oldVersion+-+newVersion);创建memento表的SQL语句构造方法执行建表语句,创建memento表程序清单:Mement
17、osrcietjxufecnandroidMyDatabaseHelper.java7.3.2备忘录实例备忘录实例 然后通过该工具类,获取数据库,并进行添加和查询操作,关键代码如下:程序清单:MementosrcietjxufecnandroidMainActivity.java private class MyOnClickListerner implements OnClickListener public void onClick(View v)mydbHelper=new MyDatabaseHelper(MainActivity.this,memento.db,null,1);SQL
18、iteDatabase db=mydbHelper.getReadableDatabase();String subStr=subject.getText().toString();String bodyStr=body.getText().toString();String dateStr=date.getText().toString();switch(v.getId()case R.id.add:title.setVisibility(View.INVISIBLE);addMemento(db,subStr,bodyStr,dateStr);Toast.makeText(MainActi
19、vity.this,添加备忘录成功!,1000).show();result.setAdapter(null);break;创建数据库辅助类获取SQLite数据库获取主题编辑框的内容 获取内容编辑框的内容 获取时间编辑框的内容 单击的是添加按钮 设置表头不可见 调用添加记录方法下拉列表内容为空7.3.2备忘录实例备忘录实例程序清单:MementosrcietjxufecnandroidMainActivity.java case R.id.query:title.setVisibility(View.VISIBLE);Cursor cursor=queryMemento(db,subStr,b
20、odyStr,dateStr);SimpleCursorAdapter resultAdapter=new SimpleCursorAdapter(MainActivity.this,R.layout.result,cursor,new String _id,subject,body,date,new int R.id.memento_num,R.id.memento_subject,R.id.memento_body,R.id.memento_date);result.setAdapter(resultAdapter);break;default:break;单击的是查询按钮设置表头可见调用
21、查询方法将查询结果显示在下拉列表 中,注意一 一对应单击的是查询按钮7.3.2备忘录实例备忘录实例程序清单:MementosrcietjxufecnandroidMainActivity.java向数据库中插入和查询记录的方法如下。public void addMemento(SQLiteDatabase db,String subject,String body,String date)db.execSQL(insert into memento_tb values(null,?,?,?),new String subject,body,date);this.subject.setText(
22、);this.body.setText();this.date.setText();public Cursor queryMemento(SQLiteDatabase db,String subject,String body,String date)Cursor cursor=db.rawQuery(select*from memento_tb where subject like?and body like?and date like?,new String%+subject+%,%+body+%,%+date+%);return cursor;执行插入操作添加数据后,将所有的文本编辑框的
23、内容设为空执行查询操作,提供模糊查询功能7.3.2备忘录实例备忘录实例事件监听器写好后,为按钮注册单击事件处理器,代码如下:MyOnClickListerner myOnClickListerner=new MyOnClickListerner();add.setOnClickListener(myOnClickListerner);query.setOnClickListener(myOnClickListerner);程序清单:MementosrcietjxufecnandroidMainActivity.java程序清单:MementosrcietjxufecnandroidMainAc
24、tivity.javaprotected void onDestroy()if(mydbHelper!=null)mydbHelper.close();操作完成后,在结束Activity前关闭数据库,代码如下:7.3.2备忘录实例备忘录实例 当程序第一次调用getReadableDatabase()方法后,SQLiteOpenHelpery会缓存已创建的SQLiteDatabase实例,多次调用getReadableDatabase()方法得到的都是同一个SQLitedatabase实例,即正常情况下,SQLiteDatebase实例会维持数据库的打开状态,因此在结束前应关闭数据库,否则会占用
25、内存。在上面程序中,我们使用了SimpleCursorAdapter封装Cursor,从而在下拉列表中显示结果记录信息,这里需注意,SimpleCursorAdapter封装Cursor时要求底层数据表的主键名为-id,因为SimpleCursorAdapter只能识别列名为-id的主键,否则会出现java.lang.IllegalArgumentException:column-id does not exist错误。程序运行后,打开DDMS视图,查看File Explorer 面板,发现在我们应用程序的包下,生成了一个databases文件夹,下面有一个memento.db文件,如图,该文
26、件就是我们在程序中创建的数据库文件。数据库文件位于datadata你的程序的包名databases中,可通过DDMS工具将该文件夹下的数据库导出来,然后下载具体的图形化界面进行查看。7.3.2备忘录实例备忘录实例文本 Android为我们提供了一个相应的命令行工具查看SQLite数据库。进入到数据库所在目录(导出的文件所放文件夹):sqlite3 数据库名 进入到该数据库然后即可利用sql语句查找相关信息。注意:通过命令行查看数据库内容时,中文在命令行上会显示乱码 7.3.2备忘录实例备忘录实例(Android系统在调用SQLiteOpenHelper的getReadableDatabase()方法时会判断系统中是否已存在数据库,如果不存在,系统会创建数据库文件,因此查找记录时不会出错,只不过查询结果为空。但若我们在创建数据库时,没有指定表结构,添加或查询时会出错)1、数据库的创建过程是怎么样的?当不存在数据库时,直接查找记录会不会出错?2、数据库的后缀名有要求吗?(后缀名可任意)7.3.2备忘录实例备忘录实例
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。