第4章Android中的数据存取程序是数据的输入、处理、输出的过程,不管是操作系统还是应用程序,都不可避免要用到大量的数据。由于内存容量有限,且一旦关机,内存中的信息都消失,因此,一般把需要下次使用的数据保存在磁盘(对于手机来说SD卡)中。操作系统一般以文件的形式来保存数据,而应用程序更喜欢使用数据库来保存。在手机中,也有许多需要保存的数据,如音频文件、视频、图片、通讯录、短信、游戏中的设置等数据。Android作为一种手机上的操作系统,提供了以下几种数据存取方式:Preference(配置)、File(文件)、SQLite(数据库)、网络等。另外,在Android中,各个应用程序组件之间是相互独立的,彼此的数据一般不能共享,为了实现数据的共享,Android提供ContentProvider组件来实现应用程序之间的数据共享(最典型的共享就如通讯录)。4.1PreferencePreference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。4.1.1Preference简介使用Preference方式来存取数据,要用到SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。调用Context.getSharedPreferences(Stringname,intmode)方法可得到SharedPreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。操作模式有三种:MODE_PRIVATE(私有)、MODE_WORLD_READABLE(可读)和MODE_WORLD_WRITEABLE(可写)。SharedPreferences提供了获得数据的方法,如:getString、getInt等。调用其edit方法返回SharedPreferences.Editor内部接口,该接口提供了保存数据的方法,如putString、putInt等,调用该接口的commit方法,可以将数据进行保存。SharedPreferences的常用方法:方法名称方法描述edit()返回SharedPreferences.Editor内部接口contains(Stringkey)判断是否包含该键值getAll()返回所有配置信息MapgetBoolean(Stringkey,booleandefValue)获得一个boolean值getFloat(Stringkey,floatdefValue)获得一个float值getInt(Stringkey,intdefValue)获得一个int值getLong(Stringkey,longdefValue)获得一个long值getString(Stringkey,StringdefValue)获得一个String值SharedPreferences.Editor的常用方法:方法名称方法描述clear()清除所有值commit()真正保存getAll()返回掺配置信息MapputBoolean(Stringkey,booleanvalue)保存一个boolean值putFloat(Stringkey,floatvalue)保存一个float值putInt(Stringkey,intvalue)保存一个int值putLong(Stringkey,longvalue)保存一个long值putString(Stringkey,Stringvalue)保存一个String值remove(Stringkey)删除该键对应的值4.1.2Preference应用实例——保存临时短信当我们正在编辑短信时,突然来电话了,这时我们离开编辑短信,去接电话。打完电话回来,我们发现刚才输入的短信还在——这就是临时短信,我们可以通过Preference来保存临时短信内容。其工作原理为:在我们的Activity类的onCreate()方法中通过getSharedPreferences()方法获得SharedPreferences接口,调用该接口的getString()方法,获得保存内容,将内容设置到我们编辑框中。在Activity类的onStop()方法中保存内容:使用getSharedPreferences().edit()方法获得SharedPreferences.Editor接口,调用SharedPreferences.Editor的putString()方法保存短信内容,并调用commit()方法提交内容。编程如下:packagecom.asc.delpy;importandroid.app.Activity;importandroid.content.SharedPreferences;importandroid.os.Bundle;importandroid.widget.Button;importandroid.widget.EditText;publicclassSample_4_1ActextendsActivity{privatestaticfinalStringTEMP_SMS=temp_sms;//temp_sms.xml就是保存的XML文件名称EditTextet1;Buttonbtn1;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);et1=(EditText)this.findViewById(R.id.et1);SharedPreferencespre=getSharedPreferences(TEMP_SMS,MODE_WORLD_READABLE);//获得SharedPreferencesStringcontent=pre.getString(sms_content,);//从SharedPreferences中获得名称为sms_content的字符串内容et1.setText(content);//将内容显示出来}@OverrideprotectedvoidonStop(){//TODOAuto-generatedmethodstubsuper.onStop();//注意:这是先调用父类的onStop方法,绝对不能删除,否则出错SharedPreferences.Editoreditor=getSharedPreferences(TEMP_SMS,MODE_WORLD_WRITEABLE).edit();Stringstr=;str=et1.getText().toString();//先从编辑框中读取用户输入的文字editor.putString(sms_content,str);//该文字以sms_content名称保存在XML文件中editor.commit();//提交保存}}其实,就是将要保存的内容作为XML文件保存到了/data/data/包名/shared_prefs下面,文件名为:temp_sms.xml(可用DDMS工具中的FileExplorer打开看得到这个文件)。4.2File我们可以将一些数据直接以文件的形式保存在设备中,如一些文本文件、PDF文件、音频、视频和图片等。Android提供了文件的读写方法。通过Context.openFileInput()方法获得标准Java文件输入流(FileInputStream),通过Context.openFileOutput()方法获得文件输出流(FileOutputStream)。使用Resources.openRawResource(R.raw.myDataFile)方法返回InputStream。例Sample_4_2用来演示File读写私有文件(就是该文件存在在于该包中,别的应用程序无法访问)如果要读取外部的文件,方法完全不同,例Sample_4_3用来读取外部文件:Resource\raw目录和Assets目录中的文件。需要注意的是,这两个目录下的文件是只读的,就是在Android下,只能读,不能修改。4.3SQLite在手机上来说,由于其资源的限制(CPU慢、内存小、存储容量小等),无法使用大型数据库。这不同于在电脑上,在电脑上一般可以另外配置一个服务器专门作为数据库服务器。因此,在手机上的数据库必须要非常精练,功能可能也很有限。SQLite是一个嵌入式数据库引擎,它是针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。SQLite数据库不像其他的数据库(如Oracle、SQLServer),它没有服务器进程,所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。4.3.1SQLiteDatabaseAndroid提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有sqlite3工具,我们可以利用它来创建数据库、创建表、执行一些常用的SQL语句。其常用的方法:方法名称方法描述openOrCreateDatabase(...)打开或创建数据库,如果要打开的数据库名存在,就单纯打开,如果不存在,就创建之insert(...)添加一条记录delete(...)删除一条记录query(...)查询记录(相当于SELECT)update(...)修改记录execSQL(...)执行一条SQL语句close(...)关闭数据库1、打开或创建数据库可以使用openOrCreateDatabase方法来打开或创建一个数据库,其方法声明为:publicstaticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)第一个参数:path就是你要打开或要创建的数据库的完整路径(包括数据库名),第二个参加是指定返回一个Cursor了类的工厂,如果没有,可用null表示。如:SQLiteDatabase.openOrCreateDatabase(/data/data/com.asc.delpy/database/temp.db,null)则意味着在/data/data/com.asc.delpy/database/目录下创建一个名称为temp.db的数据库文件,注意,该路径必须完整且准确。2、创建表实际上可用SQL语句来完成:CREATETABLE,先编写好该语句,然后调用execSQL方法:publicvoidexecSQL(Stringsql)其中的参数sql就是要执行的SQL语句,注意必须正确。如:Stringsql=CREATETABLEUsers(_idintegerprimarykeyautoincrement,usernametext,passwordtext);db.execSQL(sql);其中db就是已经打开的数据库名。3、插入数据有两种方法可插入数据:方法一:使用SQL语句,然后调用execSQL方法;Stringsql=INSERTINTOUsers(username,passwrod)VALUES('张三','123456');db.execSQL(sql);方法二:直接使用insert方法ContentValuescv=newContentValues();cv.put(username,李四);cv.put(password,111111);db.insert(Users,null,c