欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

第8章 Android数据存储与IO

来源: 开发者 投稿于  被查看 13761 次 评论:187

第8章 Android数据存储与IO


本章主要介绍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 getAll():获取全部的key-value对。
boolean getXxx(String key,xxx defValue):获取SharedPreferences数据里指定key对应的value。如果key不存在,返回默认值defValue。其中xxx可以是boolean、float、int、long、String等各种基本类型。

SharedPreferences接口并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它对应的EditZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcrbUz/OjrEVkaXRvcszhuanI58/Ct723qM/yU2hhcmVkUHJlZmVyZW5jZXPQtMjryv2+3aO6CjxibG9ja3F1b3RlPgpTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgIGNsZWFyo6ijqaO6x+W/1VNoYXJlZFByZWZlcmVuY2VzwO+1xMv509DK/b7doaMgClNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciAgcHV0WHh4o6hTdHJpbmcga2V5o6x4eHggdmFsdWWjqaO6z/JTaGFyZWRQcmVmZXJlbmNlc7TmyOvWuLaoa2V5ttTTprXEyv2+3aGjxuTW0Hh4eL/J0tTKx2Jvb2xlYW6homZsb2F0oaJpbnShomxvbmeholN0cmluZ7XIuPfW1rv5sb7A4NDNoaMKU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yICByZW1vdmWjqFN0cmluZyBrZXmjqaO6yb6z/VNoYXJlZFByZWZlcmVuY2VzwO/WuLaoa2V5ttTTprXEyv2+3c/uoaMKYm9vbGVhbiBjb21taXSjqKOpo7q1sUVkaXRvcrHgvK3N6rPJuvOjrLX308O4w7e9t6jM4b270N64xKGjCjwvYmxvY2txdW90ZT4KICAgIApTaGFyZWRQcmVmZXJlbmNlc7G+ye3Kx9K7uPa907/ao6yzzNDyzt63qNaxvdO0tL2oU2hhcmVkUHJlZmVyZW5jZXPKtcD9o6zWu8Tczai5/UNvbnRleHTM4bmptcRnZXRTaGFyZWRQcmVmZXJlbmNlc6OoU3RyaW5nIG5hbWWjrGludCBtb2Rlo6m3vbeou/HIoVNoYXJlZFByZWZlcmVuY2VzyrXA/aGjU2hhcmVkUHJlZmVyZW5jZXPK/b7d19zKx7GjtObU2i9kYXRhL2RhdGEvPHBhY2thZ2UKIG5hbWU+L3NoYXJlZF9wcmVmc8S/wrzPwqOs0tRYTUwmIzI2Njg0O8q9saO05qOsuPnUqsvYzqo8bWFwLi4uLz6howo8YnI+CgqhpLbBoaLQtMbky/zTptPDU2hhcmVkUHJlZmVyZW5jZXM6CiAgICDHsMzho7q0tL2ouMNTaGFyZWRQcmVmZXJlbmNlc7XE06bTw7PM0PLWuLaoz+DTprXEt8POysioz96jrNa4tqhNT0RFX1dPUkxEX1JFQURBQkxFv8mxu8bky/zTptPDs8zQ8rbByKGjrNa4tqhNT0RFX1dPUkxEX1dSSVRFQUJMRb/JsbvG5Mv806bTw7PM0PLQtMjroaMKICAgILK91uijugogICAgotm0tL2oxuTL/LPM0PK21NOmtcRDb250ZXh0o6zI58/CtPrC66O6CjxwcmUgY2xhc3M9"brush:java;">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文件中要添加如下两条配置:




·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对象的name属性代表了匹配的手势名,score属性代表了手势的相似度。
·自动朗读(TTS): 主要通过TextToSpeech来完成,该类提供了一个构造器: TextToSpeech(Context context,TextToSpeech.OnInitListener listener) 获得了TextToSpeech对象之后,就可调用TextToSpeech的setLanguage(Locale loc)方法来设置该TTS应使用的语言、国家选项。当程序用完了TextToSpeech对象之后,可以在Activity的OnDestroy()方法中调用它的shutdown()来关闭TextToSpeech、释放它所占用的资源。

用户评论