第8章 Android数据存储与IO

本文介绍了Android中的多种数据存储方式,包括使用SharedPreferences保存简单的配置信息,利用SQLite进行轻量级数据库管理,以及如何进行文件存储操作。同时,还探讨了手势识别与TTS等特殊输入输出功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章主要介绍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) openFileOutput openFileInput
    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.On GestureDetectorListener实例, 就是一个监听器,负责对用户手势行为提供响应。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、释放它所占用的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值