本章主要介绍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等各种基本类型。
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():将记录指针移动到第一行,如果移动成功则返回trueboolean moveToLast():将记录指针移动到最后一行,如果移动成功则返回trueboolean moveToNext():将记录指针移动到下一行,如果移动成功则返回trueboolean moveToPosition(int position):将记录指针移动到指定的行,如果移动成功则返回trueboolean 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、释放它所占用的资源。