Android数据存储和IO

来源:互联网 发布:飞天侠淘宝客源码 编辑:程序博客网 时间:2024/06/05 03:57

本节主要知识点:

1、SharedPreferences的概念和作用;

2、使用SharedPreferences保存程序的参数、选项;

3、读写、其他应用的SharedPreferences;

4、Android的文件IO;

5、读、写SD卡上的文件;

6、了解SQLite数据库;

7、使用Android的API操作SQLite数据库;

8、使用sqlite3工具管理SQLite数据库;

9、SQLiteOpenHelper类的功能和用法;

10、手势检测;

11、向手势库中添加手势;

12、识别用户手势;

具体内容

8.1 使用SharedPreferences

当程序需要保存一些格式简单的数据时,比如程序的配置信息,可以使用SharedPreferences。

8.1.1 SharedPreferences与Editor简介

SharedPreferences接口主要负责读取应用程序的key-value对数据。

boolean contains(String key);判断是否包含特性key对应的数据。

abstract Map<String,?> getAll();获取数据里全部的key-value对数据。

xxx getXxx(String key,xxx defaultValue);获取指定key对应的value。如果不存在key,返回默认的defaultValue值。

SharedPreferences通过调用edit()方法得到Editor,Editor提供以下方法向SharedPreferences中写入数据。

SharedPreferences.Editor  clear();清空SharedPreferences里所有的数据。

SharedPreferences.Editor putXxx(String key,xxx value);向SharedPreferences中存入指定key和value的数据。其中value可以是基本数据类型。

SharedPreferences.Editor remove(String key);删除指定key对应的数据项。

boolean commit();当Editor编辑完后,调用该方法提交修改。

程序通过Context的getSharedPreferences(String name,int mode)方法获取SharedPreferences的实例,mode参数支持一下几个值:

Context.MODE_PRIVATE:该SharedPreferences只能被本应用程序读取、写。

Context.MODE_WORLD_READBLE:指定该SharedPreferences数据可以被其他应用程序读取,但是不能写。

Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读取、写。

8.1.2 SharedPreferences的存储位置和格式

SharedPreferences数据的存储位置是:/data/data/<package name>/shared_prefs目录下。

SharedPreferences以XML文件格式保存,格式内容:

<?xml version="1.0" encoding="utf-8" standalone="yes"?><map><int name="xxx" value="xxx"/><String name="xxx">xxx</String></map>
8.1.3 读、写其他应用的SharedPreferences

要读写其他应用程序的SharedPreferences,首先其他应用程序对应的SharedPreferences指定了相应的权限。

访问其他应用程序的SharedPreferences的关键就是获取其他应用程序的Context,包名是应用程序的唯一标识,所以要通过包名来获取其他应用的Context。

读取其他应用的SharedPreferences的步骤:

1、获取其他应用的Context:

Context other=createPackageContext("org.lyc.io",Context.CONTEXT_IGNORE_SECURITY);

2、通过其他应用的Context,调用其getSharedPreferences(String name,int mode),获取SharedPreferences对象。

3、如果需要向其他应用写入SharedPreferences,则调用edit()方法获取相应的Editor即可。

事实上,可以通过文件IO流的读写形式来完成对其他应用的SharedPreferences数据的访问,只是便捷性不如使用SharedPreferences访问方便。

8.2 File存储

应用程序的数据文件默认保存在/data/data/<package name>/files目录下。

Context提供:

FileInputStream openFileInput(String name);

FileOutoutStream openFileOutput(String name,int mode);

来获取应用程序对应的数据文件夹下的name文件对应的输入流和输出流。

获取了输入流和输出流后,剩下的操作就是Java SE中的IO操作。

8.2.2 读写SD卡上的文件

读写SD卡上的文件的步骤:

1、判断SD卡上是否有SD卡;

2、获取SD卡目录;

3、使用IO流操作SD卡上的文件。

操作SD卡上的文件,需要加入相应的权限:

<!--在SD卡上创建和删除文件的权限-->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--在SD卡上写入数据的权限-->

<uses-permissioin android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

8.3 SQLite数据库

SQLite作为一个轻量级的数据库,在创建或者打开一个SQLite数据库时,其实只是打开一个文件准备读写。

8.3.1 SQLite简介

SQLiteDatabase代表一个数据库,底层就是一个数据库文件,应用可以通过代表指定数据库的SQLiteDatabase对象来管理、操作数据库。

1、SQLiteDatabase提供了几个静态方法来打开一个文件对应的数据库。

2、在程序中获取SQLiteDatabase对象之后,接下来就可以调用SQLiteDatabase的执行SQL语句、更新、插入、删除、查询等方法来操作数据库了。

3、SQLiteDatabase提供的查询方法都返回一个Cursor对象,Cursor同样提供了moveXXX方法来移动查询结果的记录指针。

4、当记录指针移动到指定行之后,就下来就可以调用Cursor的getXxx()方法来获取改行指定列的数据。

综上:SQLiteDatabase既代表了与数据库的连接,也可以直接执行SQL操作;Cursor可以当做JDBC中的ResultSet。

8.3.2 创建数据库和表

1、创建或者打开数据库:SQLiteDatabase提供了静态的打开或创建数据库的方法;

2、创建数据库表:SQLiteDatabase对象提供的execSQL执行SQL语句来创建数据库表:

//定义表的语句sql="create table user_inf(id integer primary key,name varchar(255),pass varchar(255)";//执行SQL语句db.execSQL(sql);
DDL(数据库定义语言):create、alter、drop;

DML(数据库操作语言):insert、update、delete;

8.3.3 使用SQL语句操作SQLite数据库

1、执行DDL和DML使用execSQL()方法;

2、执行查询使用rawQuery(String sql,String[] selectionArgs)方法,返回查询的结果Cursor。

综上,使用SQLiteDatabase进行数据库操作的步骤如下:

1、获取SQLiteDatabase对象,代表了与数据库的连接;

2、调用SQLiteDatabase的方法执行SQL语句;

3、如果是查询有返回结果,使用Cursor的方法来得到内容。

如果使用SimpleCursorAdapter来封装Cursor,注意底层数据库的主键的列名为_id,因为SimpleCursorAdapter只能识别列名为_id的主键。

4、关闭SQLiteDatabase,回收资源。

8.3.4 使用sqlite3工具

在Android SDK的tools目录下提供了一个sqlite3.exe工具,可以提供类似MySQL命令行的窗口操作。

8.3.5 使用特定方法操作SQLite数据库

对于SQL语法不熟悉,可以使用Android提供的带有占位符参数的insert、delete、update或者query方法来操作数据库。

8.3.6 事务

SQLiteDatabase提供了

1、beginTransaction()开始事务;

2、endTransaction()结束事务;

3、inTransaction()判断当前上下文是否处于事务中;

4、setTransactionSuccessful()设置事务成功标志;

示例代码:

//开始事务db.beginTransaction();try{//执行DML语句......//调用该方法设置事务成功;否则endTransaction()方法将回滚事务db.setTransactionSuccessful();}finally{//由事务的表示决定是提交事务还是回滚事务db.endTransactioin();}

Android默认为每一个操作启动一个事务,所以如果有多次的DML操作,尽量放在一个事务中执行。

8.3.7 SQLiteOpenHelper类

在实际项目中很少直接使用SQLiteDatabase的方法来打开数据库,通常继承SQLiteOpenHelper类,使用getReadableDatabase()和getWritableDatabase()方法打开数据库。

SQLiteOpenHelper的常用方法是:

1、getReadableDatabase():以读写的方法打开数据库;

2、getWritableDatabase():以写的方法打开数据库;

3、onCreate(SQLiteDatabase db):当第一次创建数据库时回调该方法。可以在该方法中生成数据库表结构和添加初始化数据;

4、onUpdate(SQLiteDatabase db,int oldVersion,int newVersion):当数据库版本更新时回调该方法。创建SQLiteOpenHelper对象时,需要一个version参数,就是数据库版本号,数据库版本号是由程序员控制的;

5、close():关闭所有打开的SQLiteDatabase;

getReadableDatabase()是以读写的方式打开数据库。其中getReadableDatabase()方法先执行getWritableDatabase()方法,如果失败,才以只读的方式打开数据库。

8.4 手势

8.4.1 手势检测

GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener实例,GestureDetector.OnGestureListener是一个监听器,提供了相应的方法,对用户手势行为提供响应。

使用Android的手势检测需要两个步骤:

1、创建一个GestureDetector对象。创建该对象,需要实现一个GestureDetector.OnGestureListener实例作为参数传入;

2、为应用程序的Activity或者特定组件的TouchEvent事件绑定监听器,在事件处理中指定把Activity或者特定组件上的TouchEvent事件交给GestureDetector处理,GestureDetector检测是否触发了特定的手势动作。

示例:

public class GestureTest extends Activity implements OnGestureListener{GestureDetector detector;public void onCreate(Bundle savedInstanceState){//省略其他操作detector=new GestureDetector(this,this);//参数分别表示GestureDetector(Context,OnGestureListener);}//将该Activity上的触碰事件交给GestureDetector处理public boolean onTouchEvent(MotionEvent me){return detector.onTouchEvent(me);}//省略实现OnGestureListener接口的方法}
8.4.2 增加手势

0 0
原创粉丝点击