1、智能终端软件开发,浙江大学计算机学院/软件学院 2010.06.,5、数据存取,智能终端开发,2010.06.,浙江大学计算机学院,3,数据存取,Android有四种方式: SharePreference 轻量级键-值方式存储,以XML文件方式保存。 文件 采用java.io.*库所提供有I/O接口,读写文件。 SQLit数据库 SQLite是轻量级嵌入式内置数据库。 ContentProvider ContentProvider可为数据封装,为多个应用共享。,2010.06.,浙江大学计算机学院,4,1、SharedPreferences,创建以键值 方式加入数据以 String Key 为
2、索引来取出数据清除,SharedPreferences settings= this.getSharedPreferences(“Demo“, MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit();,editor.putString(“name“, “value”); mit();,String str = settings.getString(“name“, “);,editor.clear().commit();,XML文件名,2010.06.,浙江大学计算机学院,5,SharedPreferences,存入XML
3、后的内容 目录:/data/data/包/shared_prefs/*.xml,XML文件名,2010.06.,浙江大学计算机学院,6,Intent,Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。 与简单函数/方法调用,或者通过库调用接口的方式不太一样。在Intent的使用中你看不到直接的函数调用,相对函数调用来说,Intent是更为抽象的概念,利用Intent所实现的软件复用的粒度是Activity/Service,比函数复用更高一些,另外耦合也更为
4、松散。,2010.06.,浙江大学计算机学院,7,2、文件存取,文件用来存储大数量的数据 采用java.io.*库所提供有I/O接口,读写文件。 只有本地文件可以被访问 优点:可以存储大容量的数据 缺点:文件更新或是格式改变可能会导致巨大的编程工作,2010.06.,浙江大学计算机学院,8,文件操作(读),读文件 Context.openFileInput(String name)打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出FileNotFoundException 异常,FileInputStream in = this.openFileInput(“rt.txt“);/打开文
5、件“rt.txt“ in.close();/关闭输入流,2010.06.,浙江大学计算机学院,9,文件操作(写),写文件 Context.openFileOutput(String name,int mode)开启一个与应用程序联系的私有文件输出流 当文件不存在时该文件将被创建 文件输出流可以在添加模式中打开,这意味新的数据将被添加到文件的末尾,FileOutputStream out = this.openFileOutput(“wt.txt“,MODE_APPEND); /打开文件“wt.txt“进行写操作、使用MODE_APPEND 在添加模式中打开文件 out.close();/关闭输
6、出流,2010.06.,浙江大学计算机学院,10,读取静态文件,要打开打包在应用程序中的静态文件,使用Resources.openRawResource(R.raw.mydatafile) 该文件必须放在文件夹res/raw/中,InputStreamin = this.getResources().openRawResource(R.raw.my); /获得Context资源 in.close(); /关闭输入流,2010.06.,浙江大学计算机学院,11,把文件存放在SDCard,访问SDCard,需要申请访问SDCard的权限。在AndroidManifest.xml中加入访问SDCar
7、d的权限如下:,2010.06.,浙江大学计算机学院,12,SDCard读写,要进行SDCard读写,必须先判断手机是否装有SDCard,并且可以进行读写。,if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)File sdCardDir = Environment.getExternalStorageDirectory();/获取SDCard目录File saveFile = new File(sdCardDir, “itcast.txt”); FileOutputStream outStream
8、 = new FileOutputStream(saveFile); outStream.write(“Android开发“.getBytes(); outStream.close(); ,2010.06.,浙江大学计算机学院,13,3、SQLite数据库编程,在某些情况下,文件不是有效的 如果多线程数据访问是相关的 如果应用程序处理可能变化的复杂数据结构 等等 内置SQLite 数据库支持 数据库对于创建它们的包套件是私有的 数据库不应该用来存贮文件 SQLite 是一个轻量级的软件库 原子量性 坚固性 独立性 耐久性 体积大小只用几千字节 一些SQL 的指令只是部分支持,例如:ALTER、
9、TABLE,2010.06.,浙江大学计算机学院,14,SQLite数据库,Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。,2010.06.,浙江大学计算机学院,15,SQLiteDatabase的execSQL()和rawQuery()方法。 execSQL()方法:可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法:可
10、以执行select语句。 execSQL()方法的使用例子:,SQLiteDatabase db = ; db.execSQL(“insert into person(name, age) values(Android开发, 4)“); db.close();,2010.06.,浙江大学计算机学院,16,创建数据库,Context.createDatabase(String name,int version ,int mode,CursorFactory factory)创建一个新的数据库并返回SQLiteDatabase 对象 假如不能被创建,则抛出FileNotFoundException
11、,SQLiteDatabase mydataBase=SQLiteDatabase.create(new CursorFactory() /创建一个数据库/工厂类,当查询时调用来实例化一个光标 Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) / TODO Auto-generated method stub return null; );,2010.06.,浙江大学计算机学院,17,创建数据库,创建新的
12、数据库,SQLiteDatabase myDataBase=this.openOrCreateDatabase(“myDataBase.db“, MODE_PRIVATE, new CursorFactory() /创建新的数据库,名称myDatabase,模式MODE_PRIVATE,鼠标工厂 /工厂类,一个可选工厂类,当查询时调用来实例化一个光标 Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) /
13、TODO Auto-generated method stub return null; );,2010.06.,浙江大学计算机学院,18,4、使用ContentProvider共享数据,当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数
14、据访问方式。 第一步需要继承ContentProvider并重写下面方法:,public class PersonContentProvider extends ContentProviderpublic boolean onCreate()public Uri insert(Uri uri, ContentValues values)public int delete(Uri uri, String selection, String selectionArgs)public int update(Uri uri, ContentValues values, String selection
15、, String selectionArgs)public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)public String getType(Uri uri),2010.06.,浙江大学计算机学院,19,使用ContentProvider共享数据,第二步需要在AndroidManifest.xml使用对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,可以把 ContentProvider看作是一个网站,authorities 就是网站域名:,