浙江大学软硬件协同设计实验室课程讲义智能手机开发浙江大学软硬件协同设计实验室、数据存取智能手机开发浙江大学软硬件协同设计实验室浙江大学计算机学院3数据存取Android有四种方式:SharePreference轻量级键-值方式存储,以XML文件方式保存。文件采用java.io.*库所提供有I/O接口,读写文件。SQLit数据库SQLite是轻量级嵌入式内置数据库。ContentProviderContentProvider可为数据封装,为多个应用共享。浙江大学软硬件协同设计实验室浙江大学计算机学院41、SharedPreferences创建以键值StringKey,StringValue方式加入数据以StringKey为索引来取出数据清除SharedPreferencessettings=this.getSharedPreferences(Demo,MODE_PRIVATE);SharedPreferences.Editoreditor=settings.edit();editor.putString(name,“value”);editor.commit();Stringstr=settings.getString(name,);editor.clear().commit();XML文件名浙江大学软硬件协同设计实验室浙江大学计算机学院5SharedPreferences存入XML后的内容目录:/data/data/<包>/shared_prefs/***.xmlXML文件名浙江大学软硬件协同设计实验室浙江大学计算机学院6IntentAndroid中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。与简单函数/方法调用,或者通过库调用接口的方式不太一样。在Intent的使用中你看不到直接的函数调用,相对函数调用来说,Intent是更为抽象的概念,利用Intent所实现的软件复用的粒度是Activity/Service,比函数复用更高一些,另外耦合也更为松散。浙江大学软硬件协同设计实验室浙江大学计算机学院72、文件存取文件用来存储大数量的数据采用java.io.*库所提供有I/O接口,读写文件。只有本地文件可以被访问优点:可以存储大容量的数据缺点:文件更新或是格式改变可能会导致巨大的编程工作浙江大学软硬件协同设计实验室浙江大学计算机学院8文件操作(读)读文件Context.openFileInput(Stringname)打开一个与应用程序联系的私有文件输入流当文件不存在时抛出FileNotFoundException异常FileInputStreamin=this.openFileInput(“rt.txt);//打开文件“rt.txt……in.close();//关闭输入流浙江大学软硬件协同设计实验室浙江大学计算机学院9文件操作(写)写文件Context.openFileOutput(Stringname,intmode)开启一个与应用程序联系的私有文件输出流当文件不存在时该文件将被创建文件输出流可以在添加模式中打开,这意味新的数据将被添加到文件的末尾FileOutputStreamout=this.openFileOutput(“wt.txt,MODE_APPEND);//打开文件“wt.txt进行写操作、使用MODE_APPEND在添加模式中打开文件……out.close();//关闭输出流浙江大学软硬件协同设计实验室浙江大学计算机学院10读取静态文件要打开打包在应用程序中的静态文件,使用Resources.openRawResource(R.raw.mydatafile)该文件必须放在文件夹res/raw/中InputStreamin=this.getResources().openRawResource(R.raw.my);…//获得Context资源in.close();//关闭输入流浙江大学软硬件协同设计实验室浙江大学计算机学院11把文件存放在SDCard访问SDCard,需要申请访问SDCard的权限。在AndroidManifest.xml中加入访问SDCard的权限如下:!--在SDCard中创建与删除文件权限--uses-permissionandroid:name=android.permission.MOUNT_UNMOUNT_FILESYSTEMS/!--往SDCard写入数据权限--uses-permissionandroid:name=android.permission.WRITE_EXTERNAL_STORAGE/浙江大学软硬件协同设计实验室浙江大学计算机学院12SDCard读写要进行SDCard读写,必须先判断手机是否装有SDCard,并且可以进行读写。if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){FilesdCardDir=Environment.getExternalStorageDirectory();//获取SDCard目录FilesaveFile=newFile(sdCardDir,“itcast.txt”);FileOutputStreamoutStream=newFileOutputStream(saveFile);outStream.write(Android开发.getBytes());outStream.close();}浙江大学软硬件协同设计实验室浙江大学计算机学院133、SQLite数据库编程在某些情况下,文件不是有效的如果多线程数据访问是相关的如果应用程序处理可能变化的复杂数据结构等等内置SQLite数据库支持数据库对于创建它们的包套件是私有的数据库不应该用来存贮文件SQLite是一个轻量级的软件库原子量性坚固性独立性耐久性体积大小只用几千字节一些SQL的指令只是部分支持,例如:ALTER、TABLE浙江大学软硬件协同设计实验室浙江大学计算机学院14SQLite数据库Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。浙江大学软硬件协同设计实验室浙江大学计算机学院15SQLiteDatabase的execSQL()和rawQuery()方法。execSQL()方法:可以执行insert、delete、update和CREATETABLE之类有更改行为的SQL语句;rawQuery()方法:可以执行select语句。execSQL()方法的使用例子:SQLiteDatabasedb=....;db.execSQL(insertintoperson(name,age)values('Android开发',4));db.close();浙江大学软硬件协同设计实验室浙江大学计算机学院16创建数据库Context.createDatabase(Stringname,intversion,intmode,CursorFactoryfactory)创建一个新的数据库并返回SQLiteDatabase对象假如不能被创建,则抛出FileNotFoundExceptionSQLiteDatabasemydataBase=SQLiteDatabase.create(newCursorFactory(){//创建一个数据库//工厂类,当查询时调用来实例化一个光标@OverridepublicCursornewCursor(SQLiteDatabasedb,SQLiteCursorDrivermasterQuery,StringeditTable,SQLiteQueryquery){//TODOAuto-generatedmethodstubreturnnull;}});浙江大学软硬件协同设计实验室浙江大学计算机学院17创建数据库创建新的数据库SQLiteDatabasemyDataBase=this.openOrCreateDatabase(myDataBase.db,MODE_PRIVATE,newCursorFactory(){//创建新的数据库,名称myDatabase,模式MODE_PRIVATE,鼠标工厂//工厂类,一个可选工厂类,当查询时调用来实例化一个光标@OverridepublicCursornewCursor(SQLiteDatabasedb,SQLiteCursorDrivermasterQuery,StringeditTable,SQLiteQueryquery){//TODOAuto-generatedmethodstubreturnnull;}});浙江大学软硬件协同设计实验室浙江大学计算机学院184、使用ContentProvider共享数据当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferencesAPI读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。第一步需要继承ContentProvider并重写下面方法:publicclassPersonContentProviderextendsContentProvider{publicbooleanonCreate()publicUriinsert(Uriuri,ContentValuesvalues)publicintdelete(Uriuri,Stringselection,