《数据存储与共享.ppt》由会员分享,可在线阅读,更多相关《数据存储与共享.ppt(37页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、GoogleAndroid数据存储与共享数据存储与共享onandroid本章内容本章内容n首选项信息首选项信息私有数据存储私有数据存储公有数据存储与共享公有数据存储与共享n数据文件数据文件内存数据文件内存数据文件SD卡数据文件卡数据文件nSQLite数据库数据库SQLite基本操作基本操作SQLiteOpenHelpernContentProvider使用使用ContentProvider发布数据发布数据使用使用ContentResolver获取数据获取数据数据存取方式数据存取方式n首选项信息首选项信息Preference键键-值值方式存储,以方式存储,以xml文件的形式保存文件的形式保存n数
2、据文件数据文件File采用采用java.io.*库所提供库所提供I/O接口读写文件接口读写文件n数据库数据库SQLiteSQLite是轻量级的嵌入式数据库引擎是轻量级的嵌入式数据库引擎nContentProvider用于实现不同应用程序之间的数据共享用于实现不同应用程序之间的数据共享(系统系统)首选项信息首选项信息n什么是首选项?什么是首选项?可定制的设置选项或菜单可定制的设置选项或菜单程序的界面风格、操作习惯、常用列表等数据信息程序的界面风格、操作习惯、常用列表等数据信息首选项键值对形式存储首选项键值对形式存储XML文件文件应用程序中可以通过指定不同的应用程序中可以通过指定不同的XML文件名
3、来创建多个文件名来创建多个首选项信息数据文件首选项信息数据文件SharedPreferences类类首选项信息首选项信息n首选项信息的保护和公开模式首选项信息的保护和公开模式MODE_PRIVATE:私有模式:私有模式MODE_WORLD_READABLE:全局可读模式:全局可读模式MODE_WORLD_WRITEABLE:全局可写模式:全局可写模式(无效无效)首选项信息:私有数据存储首选项信息:私有数据存储nSharedPreferences获取获取publicSharedPreferencesgetSharedPreferences(Stringname,intmode)例:例:Share
4、dPreferencessp=getSharedPreferences(myShare,MODE_PRIVATE);首选项信息:私有数据存储首选项信息:私有数据存储nSharedPreferences提供的方法提供的方法booleangetBoolean(Stringkey,booleandefValue)floatgetFloat(Stringkey,floatdefValue)intgetInt(Stringkey,intdefValue)longgetLong(Stringkey,longdefValue)StringgetString(Stringkey,StringdefValue)
5、首选项信息:私有数据存储首选项信息:私有数据存储nSharedPreferences.EditorSharedPreferences对象只提供对象只提供读取读取数据的方法,不能数据的方法,不能进行数据的存储和修改操作。这些操作需要通过进行数据的存储和修改操作。这些操作需要通过SharedPreferences类的嵌套类类的嵌套类SharedPreferences.Editor类所提供的方法来实现类所提供的方法来实现SharedPreferences.Editor获取获取Editoreditor=sp.edit();首选项信息:私有数据存储首选项信息:私有数据存储nSharedPreferenc
6、es.Editor提供的方法提供的方法putBoolean(Stringkey,booleanvalue)putFloat(Stringkey,floatvalue)putInt(Stringkey,intvalue)putLong(Stringkey,longvalue)putString(Stringkey,Stringvalue)remove(Stringkey)commit()contains(Stringkey)首选项信息:公有数据存储与共享首选项信息:公有数据存储与共享n实现过程实现过程应用应用1创建首选项模式为创建首选项模式为:MODE_WORLD_READABLEMODE_WO
7、RLD_WRITEABLE应用应用2获取上下文环境获取上下文环境(共享首选项在包内共享首选项在包内)Contextcontext=createPackageContext(,Context.CONTEXT_IGNORE_SECURITY);SharedPreferencessp=context.getSharedPreferences(SPShare,MODE_WORLD_READABLE);.首选项信息:实例首选项信息:实例n实例实例数据位于手机目录下:数据位于手机目录下:/data/data/shared_prefs数据文件数据文件n数据文件特点数据文件特点首选项信息只能以键值对的形式首选
8、项信息只能以键值对的形式保存特定格式数据保存特定格式数据FileInputStreamFileOutputStreamopenFileInput()openFileOutput()数据文件数据文件nContext类提供方法类提供方法FileInputStreamopenFileInput(Stringname)throwsFileNotFoundExceptionFileOutputStreamopenFileOutput(Stringname,intmode)throwsFileNotFoundExceptionmode为文件操作模式,值为整数类型的常量:为文件操作模式,值为整数类型的常量:
9、MODE_PRIVATE:默认输出模式:默认输出模式MODE_APPEND:追加模式:追加模式MODE_WORLD_READABLE:全局只读模式:全局只读模式MODE_WORLD_WRITEABLE:全局只写模式:全局只写模式MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE:全局读写:全局读写模式模式数据文件数据文件nContext类提供方法类提供方法deleteFile():删除文件:删除文件getDir():创建:创建/获取一个文件目录获取一个文件目录fileList():列出本应用程序创建的所有文件:列出本应用程序创建的所有文件getFileDir():
10、获取已创建文件的路径:获取已创建文件的路径数据文件:内存数据文件数据文件:内存数据文件n内存数据文件特点内存数据文件特点存放少量数据存放少量数据应用程序卸载时其内存中所关联的数据文件也被删除应用程序卸载时其内存中所关联的数据文件也被删除由程序创建的数据文件通常被保存在由程序创建的数据文件通常被保存在/data/data/files目录下目录下数据文件:内存数据文件数据文件:内存数据文件n实例实例 数据文件:数据文件:SD卡数据文件卡数据文件nSD卡数据文件特点卡数据文件特点大量数据大量数据在程序中编写检查在程序中编写检查SD卡是否可用的程序卡是否可用的程序需申明对需申明对SD卡(外部存储空间)
11、的使用权限卡(外部存储空间)的使用权限数据文件:数据文件:SD卡数据文件卡数据文件nSD卡数据文件常用操作卡数据文件常用操作判断判断SD是否存在是否存在获得获得SD卡路径卡路径例例Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)File sdCardDir=Environment.getExternalStorageDirectory();SQLite数据库数据库nSQLite概述概述SQLite是一种轻量级的基于文件的数据库管理系统是一种轻量级的基于文件的数据库管理系统由由C语言编写,实现了标准语言
12、编写,实现了标准SQL中的中的CRUD操作操作SQLite小巧、高效,适用于手机等嵌入式设备中小巧、高效,适用于手机等嵌入式设备中SQLite内部支持以下几种数据类型:内部支持以下几种数据类型:NULL:空值:空值INTEGER:有符号整数:有符号整数REAL:浮点数:浮点数TEXT:文本字符串:文本字符串BLOB:二进制字节数据:二进制字节数据SQLite数据库数据库nSQLiteDatabase方法方法publicstaticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)打
13、开打开/创建数据库,参数一为数据库文件路径,参数二可为创建数据库,参数一为数据库文件路径,参数二可为nullpublicvoidexecSQL(Stringsql)publicCursorrawQuery(Stringsql,StringselectionArgs)booleanmoveToNext()/moveToPrevious()/moveToFirst()booleanisFirst()/isLast()intgetCount()intgetXXX(intcolumnIndex)SQLite数据库数据库nSQLite基本操作实例基本操作实例数据库文件保存在目录数据库文件保存在目录/da
14、ta/data/files/stu.db3实例:实例:SQLite1(带(带provider发布数据)发布数据)SQLite数据库数据库nSQLiteOpenHelper提供方法辅助创建和打开数据库,管理数据库不同版本提供方法辅助创建和打开数据库,管理数据库不同版本使用时需要创建一个类,继承类使用时需要创建一个类,继承类SQLiteOpenHelper重写其相对应的方法来实现创建、打开、更新数据库的重写其相对应的方法来实现创建、打开、更新数据库的操作操作常用方法如下常用方法如下voidonCreate(SQLiteDatabasedb)voidonOpen(SQLiteDatabasedb)v
15、oidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)SQLiteDatabasegetWritableDatabase()SQLiteDatabasegetReadableDatabase()SQLite数据库数据库nSQLiteOpenHelperMVC思想思想使用分层思想设计数据模块使用分层思想设计数据模块n实例:实例:SQLite2SQLiteContentProvidern概念概念跨应用程序数据共享的方式跨应用程序数据共享的方式应用可通过应用可通过ContentProvider发布数据,但不会泄发布数据,但不会泄露数据在其
16、应用程序内部的组织和存储方式露数据在其应用程序内部的组织和存储方式其他应用可通过其他应用可通过ContentResolver来获取某个应用来获取某个应用发布出来的共享数据发布出来的共享数据通信录、通话记录、短信记录、相片库、铃声库等系统通信录、通话记录、短信记录、相片库、铃声库等系统应用程序也是通过应用程序也是通过ContentProvider来共享自己的来共享自己的数据数据ContentProvidernuri是是ContentProvider提供的访问数据的标签提供的访问数据的标签A:标准前缀,用来说明这是一个:标准前缀,用来说明这是一个ContentProvider控制的数据控制的数据B
17、:URI的标识,该标识定义了这是哪个的标识,该标识定义了这是哪个ContentProvider提供的数据提供的数据C:路径,:路径,URI中可能不包括路径,也可能包括一个或中可能不包括路径,也可能包括一个或多个多个D:需要获取的记录的:需要获取的记录的ID;如果没有该;如果没有该ID,就表示返回,就表示返回全部数据全部数据ContentProvidern使用使用ContentProvider发布数据发布数据ContentProvider提供的数据以类似于数据库表的提供的数据以类似于数据库表的二维结构来组织。每一行表示一条记录,每一行包含若二维结构来组织。每一行表示一条记录,每一行包含若干列。通
18、过调用类干列。通过调用类ContentProvider提供的方法,其提供的方法,其他应用程序可以对提供的数据进行查询、更新、插入、他应用程序可以对提供的数据进行查询、更新、插入、删除等操作删除等操作从类从类ContentProvider派生出一个子类,即自定义一派生出一个子类,即自定义一个个ContentProvider,并根据需要重写其中的方法,并根据需要重写其中的方法在在AndroidManifest.xml中注册这个自定义的中注册这个自定义的ContentProviderContentProvidern自定义自定义ContentProvider需重写的主要方法需重写的主要方法boolea
19、nonCreate()Cursorquery(Uriuri,Stringprojection,Stringselection,StringselectionArgs,StringsortOrder)intupdate(Uriuri,ContentValuesvalues,Stringselection,StringselectionArgs)Uriinsert(Uriuri,ContentValuesvalues)intdelete(Uriuri,Stringselection,StringselectionArgs)StringgetType(Uriuri)ContentProvidern使
20、用使用ContentResolver获取数据获取数据通过类通过类Context的的getContentResolver()方法可以方法可以获得一个类获得一个类ContentResolver的实例的实例类类ContentResolver的常用方法有:的常用方法有:Cursorquery(Uriuri,Stringprojection,Stringselection,StringselectionArgs,StringsortOrder)intupdate(Uriuri,ContentValuesvalues,Stringwhere,StringselectionArgs)Uriinsert(Ur
21、iurl,ContentValuesvalues)intdelete(Uriurl,Stringwhere,StringselectionArgs)ContentProvidern在例在例SQLite1中创建类中创建类StuProvider(已建已建)只介绍向其他应用程序提供查询的只介绍向其他应用程序提供查询的ContentProvider接口接口,其他可自行完成其他可自行完成public class StuProvider extends ContentProvider SQLiteDatabase db;.public boolean onCreate()try db=SQLiteData
22、base.openOrCreateDatabase(this.getContext().getFilesDir().toString()+/stu.db3,null);catch(Exception e)return false;return true;public Cursor query(Uri uri,String projection,String selection,String selectionArgs,String sortOrder)Cursor cursor=db.rawQuery(select*from student,null);return cursor;Conten
23、tProvidern在上例工程的在上例工程的AndroidManifest.xml文件中添加文件中添加标记,注册定义的标记,注册定义的StuProvidern定义后定义后URI为为 .ContentProvidern在本例工程的主在本例工程的主Activity中获取应用发布的数据中获取应用发布的数据ContentResolver resolver=getContentResolver();Uri uri=Uri.parse(content:/com.example.sqlite1.StuProvider);Cursor cursor=resolver.query(uri,null,null,n
24、ull,null);while(true)if(cursor.moveToNext()=false)break;String i=cursor.getString(0);String n=cursor.getString(1);int s=cursor.getInt(2);String tmp=list.getText().toString();list.setText(tmp+n+i+n+s);ContentProvidern实例实例:ReadContentContentProvidern使用使用Activity.managedQuery()获取数据获取数据获取一个包含指定数据的获取一个包含
25、指定数据的Cursor对象,并由对象,并由Activity来接管这个来接管这个Cursor的生命周期。的生命周期。首先该函数通过调用首先该函数通过调用getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)获取一个包含指定数据的获取一个包含指定数据的Cursor对象对象然后通过调用然后通过调用startManagingCursor(c)实现由实现由Activity来接管返回的来接管返回的Cursorc的生命周期的生命周期ContentProvidern在本例工程的主在本例工程的主Activity中获
26、取中获取系统系统发布的数据发布的数据private static final String COLUMNS=Contacts.DISPLAY_NAME,Phone.NUMBER;Cursor cursor=this.managedQuery(,COLUMNS,null,null,null);int idIndex=cursor.getColumnIndex(COLUMNS0);int numIndex=cursor.getColumnIndex(COLUMNS1);ArrayList list=new ArrayList();while(cursor.moveToNext()String name=cursor.getString(idIndex);String num=cursor.getString(numIndex);list.add(name+num);ContentProvidern添加权限声明添加权限声明n实例实例:ContentProvider作业作业P1646thanks