GoogleAndroid数据存储与共享onandroid本章内容首选项信息–私有数据存储–公有数据存储与共享数据文件–内存数据文件–SD卡数据文件SQLite数据库–SQLite基本操作–SQLiteOpenHelperContentProvider–使用ContentProvider发布数据–使用ContentResolver获取数据数据存取方式首选项信息Preference–键-值方式存储,以xml文件的形式保存数据文件File–采用java.io.*库所提供I/O接口读写文件数据库SQLite–SQLite是轻量级的嵌入式数据库引擎ContentProvider–用于实现不同应用程序之间的数据共享(系统)首选项信息什么是首选项?–可定制的设置选项或菜单–程序的界面风格、操作习惯、常用列表等数据信息–首选项键值对形式存储–XML文件–应用程序中可以通过指定不同的XML文件名来创建多个首选项信息数据文件–SharedPreferences类首选项信息首选项信息的保护和公开模式–MODE_PRIVATE:私有模式–MODE_WORLD_READABLE:全局可读模式–MODE_WORLD_WRITEABLE:全局可写模式(无效)首选项信息:私有数据存储SharedPreferences获取–publicSharedPreferencesgetSharedPreferences(Stringname,intmode)–例:SharedPreferencessp=getSharedPreferences(myShare,MODE_PRIVATE);首选项信息:私有数据存储SharedPreferences提供的方法–booleangetBoolean(Stringkey,booleandefValue)–floatgetFloat(Stringkey,floatdefValue)–intgetInt(Stringkey,intdefValue)–longgetLong(Stringkey,longdefValue)–StringgetString(Stringkey,StringdefValue)首选项信息:私有数据存储SharedPreferences.EditorSharedPreferences对象只提供读取数据的方法,不能进行数据的存储和修改操作。这些操作需要通过SharedPreferences类的嵌套类SharedPreferences.Editor类所提供的方法来实现–SharedPreferences.Editor获取Editoreditor=sp.edit();首选项信息:私有数据存储SharedPreferences.Editor提供的方法–putBoolean(Stringkey,booleanvalue)–putFloat(Stringkey,floatvalue)–putInt(Stringkey,intvalue)–putLong(Stringkey,longvalue)–putString(Stringkey,Stringvalue)–remove(Stringkey)–commit()–contains(Stringkey)首选项信息:公有数据存储与共享实现过程–应用1创建首选项模式为:MODE_WORLD_READABLEMODE_WORLD_WRITEABLE–应用2获取上下文环境(共享首选项在包内)Contextcontext=createPackageContext(com.example.sp,Context.CONTEXT_IGNORE_SECURITY);SharedPreferencessp=context.getSharedPreferences(SPShare,MODE_WORLD_READABLE);......首选项信息:实例实例数据位于手机目录下:/data/data/package_name/shared_prefs数据文件数据文件特点–首选项信息只能以键值对的形式–保存特定格式数据–FileInputStream–FileOutputStream–openFileInput()–openFileOutput()数据文件Context类提供方法–FileInputStreamopenFileInput(Stringname)throwsFileNotFoundException–FileOutputStreamopenFileOutput(Stringname,intmode)throwsFileNotFoundExceptionmode为文件操作模式,值为整数类型的常量:–MODE_PRIVATE:默认输出模式–MODE_APPEND:追加模式–MODE_WORLD_READABLE:全局只读模式–MODE_WORLD_WRITEABLE:全局只写模式–MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE:全局读写模式数据文件Context类提供方法–deleteFile():删除文件–getDir():创建/获取一个文件目录–fileList():列出本应用程序创建的所有文件–getFileDir():获取已创建文件的路径数据文件:内存数据文件内存数据文件特点–存放少量数据–应用程序卸载时其内存中所关联的数据文件也被删除–由程序创建的数据文件通常被保存在/data/data/package_name/files目录下数据文件:内存数据文件实例数据文件:SD卡数据文件SD卡数据文件特点–大量数据–在程序中编写检查SD卡是否可用的程序–需申明对SD卡(外部存储空间)的使用权限!--在SD卡中创建与删除文件权限--uses-permissionandroid:name=android.permission.MOUNT_UNMOUNT_FILESYSTEMS/!--往SDCard写入数据权限--uses-permissionandroid:name=android.permission.WRITE_EXTERNAL_STORAGE/数据文件:SD卡数据文件SD卡数据文件常用操作–判断SD是否存在–获得SD卡路径–例Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)FilesdCardDir=Environment.getExternalStorageDirectory();SQLite数据库SQLite概述–SQLite是一种轻量级的基于文件的数据库管理系统–由C语言编写,实现了标准SQL中的CRUD操作–SQLite小巧、高效,适用于手机等嵌入式设备中–SQLite内部支持以下几种数据类型:NULL:空值INTEGER:有符号整数REAL:浮点数TEXT:文本字符串BLOB:二进制字节数据SQLite数据库SQLiteDatabase方法–publicstaticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)打开/创建数据库,参数一为数据库文件路径,参数二可为null–publicvoidexecSQL(Stringsql)–publicCursorrawQuery(Stringsql,String[]selectionArgs)–booleanmoveToNext()/moveToPrevious()/moveToFirst()–booleanisFirst()/isLast()–intgetCount()–intgetXXX(intcolumnIndex)SQLite数据库SQLite基本操作实例–数据库文件保存在目录/data/data/package_name/files/stu.db3–实例:SQLite1(带provider发布数据)SQLite数据库SQLiteOpenHelper–提供方法辅助创建和打开数据库,管理数据库不同版本–使用时需要创建一个类,继承类SQLiteOpenHelper–重写其相对应的方法来实现创建、打开、更新数据库的操作–常用方法如下voidonCreate(SQLiteDatabasedb)voidonOpen(SQLiteDatabasedb)voidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)SQLiteDatabasegetWritableDatabase()SQLiteDatabasegetReadableDatabase()SQLite数据库SQLiteOpenHelper–MVC思想–使用分层思想设计数据模块实例:–SQLite2–SQLiteContentProvider概念–跨应用程序数据共享的方式–应用可通过ContentProvider发布数据,但不会泄露数据在其应用程序内部的组织和存储方式–其他应用可通过ContentResolver来获取某个应用发布出来的共享数据–通信录、通话记录、短信记录、相片库、铃声库等系统应用程序也是通过ContentProvider来共享自己的数据appappappContentResolverContentResolverContentResolverContentProviderContentProviderContentProvideruri是ContentProvider提供的访问数据的标签–A:标准前缀,用来说明这是一个ContentProvider控制的数据–B:URI的标识,该标识定义了这是哪个ContentProvider提供的数据–C:路径,URI中可能不包括路径,也可能包括一个或多个–D:需要获取的记录的ID;如果没有该ID,就表示返回全部数据–content://com.example.sqlite1.StuProviderContentProvider使用ContentProvider发布数据–ContentProvider提供的数据以类似于数据库表的二维结构来组织。每一行表示一条记录,每一行包含若干列。通过调用类ContentProvider提供的方法,其他应用程序可以对提供的数据进行查询、更新、插入、删除等操作–从类ContentProvider派生出一个子类,即自定义一个ContentProvider,并根据需要重写其中的方法–在AndroidManifest.xml中注册这个自定义的ContentProviderContentProvider自定义ContentProvider需重写的主要方法–booleanonCreate()–Cursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)–intupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)–Uriinsert(Uriuri,ContentValuesvalues)–intdelete(Uriuri,Stringselection,String[]selectionArgs)–StringgetType(Uriuri)ContentProvider使用ContentResolver获取数据–通过类Context的getContentResolver()方法可以获得一个类ContentResolver的实例–类ContentResolver的常用方法有:–Cursorquery(Uriuri,String[]projection,Stringselection,String[