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 增加手势
- Android数据存储和IO
- Android的数据存储和IO
- Android学习17--Android的数据存储和IO
- Android笔记----Android的数据存储和IO操作
- Android笔记----Android的数据存储和IO操作
- android学习—数据存储和IO-SharedPreference和Editor
- android学习—数据存储和IO-SharedPreference和Editor
- android 之数据存储(IO)
- Android数据存储与IO
- Android数据存储与IO
- Android数据存储之IO
- Android数据存储与IO
- Android数据存储与IO
- Android数据存储于IO
- Android数据存储与IO
- Android 数据存储和IO——SharedPreferences(一)
- Android 数据存储和IO——SQLite(二)
- Android 数据存储和IO——SQLite(三)
- 《数据结构》复习笔记--二叉树2
- switch...case用法
- UVa 202 Repeating Decimals(模拟)
- 各平台的延时函数
- 【iOS7开发快速入门】代码示例3-1
- Android数据存储和IO
- Sed - Workflow
- 蓝桥杯:标题:剪格子
- 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)
- Android—如何使用Eclipse svn插件管理Android项目
- 资源文件转换成Drawable或Bitmap
- 强龙本压不过地头蛇,除非拼爹
- curl 命令行下载工具使用方法小结
- MySql 表设计原则与注意事项