第8章 Android数据存储与IO

来源:互联网 发布:百变小樱之知樱复仇 编辑:程序博客网 时间:2024/05/16 15:41
本章主要介绍Android的输入、输出支持,Android为文件IO提供了openFileOutput和openFileInput两个便捷的方法;为记录、访问应用程序的参数、选项提供了SharedPreferences工具类,可以方便地读、写参数选项;除此之外,重点掌握的是SQLite数据库,Android内置SQLite数据库,且为此提供了大量方便的工具类;最后,手势支持和自动朗读也算是Android的特别的输入、输出。
上图!

    

【知识点】
·SharedPreferences和Editor简介
    有些时候,应用程序有少量的数据需要保存,而且这些数据的格式简单:都是普通的字符串、标量类型的值等,比如应用程序的各种配置信息(如是否发开音乐、是否使用振动效果等)、玩家积分)等,对于这种数据,Android提供了SharedPreferences进行保存。SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此它保存的数据主要是简单类型的key-value对。SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法访问SharedPreferences中的key-value对 
boolean contains(String key):判断SharedPreferences是否包含特定key的数据。 
      abstract Map<String,?>  getAll():获取全部的key-value对。 
      boolean getXxx(String key,xxx defValue):获取SharedPreferences数据里指定key对应的value。如果key不存在,返回默认值defValue。其中xxx可以是boolean、float、int、long、String等各种基本类型。


    SharedPreferences接口并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它对应的Editor对象,Editor提供如下方法向SharedPreferences写入数据:
SharedPreferences.Editor  clear():清空SharedPreferences里的所有数据。 
SharedPreferences.Editor  putXxx(String key,xxx value):向SharedPreferences存入指定key对应的数据。其中xxx可以是boolean、float、int、long、String等各种基本类型。
SharedPreferences.Editor  remove(String key):删除SharedPreferences里指定key对应的数据项。
boolean commit():当Editor编辑完成后,调用该方法提交修改。
    
SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法获取SharedPreferences实例。SharedPreferences数据总是保存在/data/data/<package name>/shared_prefs目录下,以XML格式保存,根元素为<map.../>。

·读、写其它应用SharedPreferences:
    前提:创建该SharedPreferences的应用程序指定相应的访问权限,指定MODE_WORLD_READABLE可被其它应用程序读取,指定MODE_WORLD_WRITEABLE可被其它应用程序写入。
    步骤:
    ①创建其它程序对应的Context,如下代码:
useCount=createPackageContext(“org.lxj.io”,Context.CONTEXT_IGNORE_SECURITY);//其中“org.lxj.io”是其它程序的包名
    ②调用其它程序Context的getSharedPreferences(String name,int mode)即可获取相应的SharedPreferences对象。
    ③如果需要想其他医用的SharedPreferences数据写入数据,调用SharedPreferences的edit()方法获取Editor即可。

·File存储
    1)openFileOutputopenFileInput
    Context提供了如下两个方法来打开应用程序的数据文件夹里的文件IO流:
FileInputStream  openFileInput(String  name):打开应用程序的数据文件夹下的name文件对应输入流。
FileOutputStream  openOutput(String  name,int mode):打开应用程序的数据文件夹下的name文件对应输出流。第二个参数指定打开文件模式:
    除此外,Context还提供如下方法访问应用程序的数据文件夹:
getDir(String  name,int  mode):在应用程序的数据文件夹下获取或创建name对应的子目录。
File getFilesDir():获取该应用程序的数据文件夹的绝对路径。
String[ ]  fileList():返回该应用程序的数据文件夹下的全部文件。
deleteFile(String):删除该应用程序的数据文件夹下的指定文件。
    
    2)读写SD卡上的文件
    为了更好地存、取应用程序的大文件数据,应用程序需要读、写SD卡上的文件。SD卡大大扩充手机的存储能力。读、写SD上的文件的步骤:
    ①调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且应用程序有读写SD卡的权限。如下代码:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);//如果插入SD卡,并且程序有读写SD卡的权限,返回true
    ②调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录。
    ③使用FileInputStream、FileOutputStream、FileReader或FileWriter读、写SD卡里的文件。
    ④为了有读写SD的权限,在AndroidAManifest.xml文件中要添加如下两条配置:
<!-- 在SD卡中创建与删除文件权限 --><uses-permission  android:name="android.permission.MOUNT_UNMOUNT_FILESYATEMS"><!-- 在SD卡写入数据权限 --><uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE">

·SQLiteDatabase
    SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(如手机、PDA等)适量数据存取。SQLite只是一个文件。Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了。
SQLiteDatabase提供了如下静态方法打开一个文件对应的数据库:
static SQLiteDatabase openDatabase(String  path,SQLiteDatabase.CursorFactory factory,int  flags):打开path文件代表的SQLite数据库.
static SQLiteDatabase  openOrCreateDatabase(File  file,SQLiteDatabaseCursorFactory factory):打开或创建(如果不存在)file文件所代表的SQLite数据库.
static SQLiteDatabase  openOrCreateDatabase(String  path,SQLiteDatabaseCursorFactory factory):打开或创建(如果不存在)path文件所代表的SQLite数据库.


在程序中获取SQLiteDatabase对象之后,接下来就可调用SQLiteDatabase的如下方法来操作数据库:
execSQL(String  sql,Object[ ]  bindArgs):执行带占位符的SQL语句。
execSQL(String sql):执行SQL语句。
insert(String table,String nullColumnHack,ContentValues  values):向执行表中插入数据。
update(String table ,ContentValues  values,String  whereClause,String[ ]  whereArgs):更新特定表中的特定数据
delete(String table,String whereClause,String[ ] whereArgs):删除指定表中的特定数据。

Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy):对执行数据表执行查询。

Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对执行数据表执行查询。limit参数控制最多查询几条记录(用于控制分页的参数)。

Cursor  query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对指定表执行查询语句。其中第一个参数控制是否取出重复值。
 
rawQuery(String sql,String[ ] selectionArgs):执行带占位符的SQL查询。
beginTransaction():开始事物。
endTransaction():结束事物。

上面查询方法都是返回一个Cursor对象,Cursor提供了如下方法来移动查询结果的记录指针:
move(int  offset):将记录指针向上或向下移动指定的行数,offset为整数时向下移,为负数时向上移
boolean  moveToFirst():将记录指针移动到第一行,如果移动成功则返回true
boolean  moveToLast():将记录指针移动到最后一行,如果移动成功则返回true
boolean  moveToNext():将记录指针移动到下一行,如果移动成功则返回true
boolean  moveToPosition(int  position):将记录指针移动到指定的行,如果移动成功则返回true
boolean  moveToPrevious():将记录指针移动到上一行,如果移动成功则返回true
一旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取改行指定列的数据。
 
·使用SQL语句操作SQLite数据库
    SQLiteDatabase的execSQL方法可执行任意SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,一般用于执行DDL语句或DML语句:如果需要执行查询语句,可以调用SQLiteDatabase的rawQuery(String sql,String[ ]  selectionArgs)方法。示例代码如下:
db.execSQL("insert into news_inf values(null,?,?)",new String[] {title,content}); //执行插入语句
    使用SQLiteDatabase进行数据库操作的步骤如下:
    ①获取SQLiteDatabase对象,它代表了与数据库的连接。
    ②调用SQLiteDatabase的方法来执行SQL语句。
    ③操作SQL语句的执行结果,比如用SimpleCursorAdapter封装Cursor。
    ④关闭SQLiteDatabase,回收资源。
 
·事务
    SQLiteDatabase中包含如下两个方法来控制事务:
        beginTransaction():开始事务。
        endTransaction():结束事务。
    除此之外,SQLiteDatabase还提供了如下方法判断当前上下文是否处于事务环境中。
        inTransaction():如果当前上下文处于事务中,返回true,否则返回false;
    当程序执行endTransaction()方法时将会结束事务--到底是提交事务,还是回滚事务?取决于SQLiteDatabase是否调用了setTransactionSuccessful()方法来设置事务标志,如果程序事务执行中调用该方法设置了事务成功则提交事务,否则程序将回滚事务。示例代码:
db.beginTransaction();//开始事务try{    //执行DML语句    ...    //调用该方法设置事务成功。否则endTransaction()方法将回滚事务    db.setTransactionSuccessful();}finally{     //由事务的标志决定是提交事务还是回滚事务    db.endTransaction();}

·SQLiteOpenHelper类:
    SQLiteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate(SQLiteDatabase  db)和onUpgrade(SQLiteDatabase  db,int  oldVersion,int  newVersion)方法。 
SQLiteOpenHelper包含如下常用的方法:
synchronized  SQLiteDatabase  getReadableDatabase():以读写的方式打开数据库对应的SQLiteDatabase对象
synchronized  SQLiteDatabase  getWritableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象
abstract  void  onCreate(SQLiteDatabase  db):当第一次创建数据库时回调该方法
abstract  void  onUpgrade(SQLiteDatabase  db,int  oldVersion,int  newVersion):当数据库版本更新时回调该方法
synchronized  void  close():关闭所有打开的SQLiteDatabase 
    一旦得到了SQLiteOpenHelper对象之后,程序无需使用SQLiteDatabase的静态方法创建SQLiteDatabase实例,而且可以用getWritableDatabase()或getReadableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase实例。

·手势支持
    Android提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureDetectorListener实例,就是一个监听器,负责对用户手势行为提供响应。Android还允许应用程序把用户手势添加到指定的文件中,使用GestureLibrary来代表手势库,并提供GestureLibraries工具类来创建手势库,提供recognize(Gesture ges)方法来识别手势,该方法返回ArrayList<Prediction>,其中Prediction封装了手势的匹配信息,Prediction对象的name属性代表了匹配的手势名,score属性代表了手势的相似度。

·自动朗读(TTS)
    主要通过TextToSpeech来完成,该类提供了一个构造器:
        TextToSpeech(Context context,TextToSpeech.OnInitListener listener)
    获得了TextToSpeech对象之后,就可调用TextToSpeech的setLanguage(Locale loc)方法来设置该TTS应使用的语言、国家选项。当程序用完了TextToSpeech对象之后,可以在Activity的OnDestroy()方法中调用它的shutdown()来关闭TextToSpeech、释放它所占用的资源。

6 0
原创粉丝点击