第8章数据存储与访问课件.ppt

上传人:牧羊曲112 文档编号:1822951 上传时间:2022-12-20 格式:PPT 页数:43 大小:813KB
返回 下载 相关 举报
第8章数据存储与访问课件.ppt_第1页
第1页 / 共43页
第8章数据存储与访问课件.ppt_第2页
第2页 / 共43页
第8章数据存储与访问课件.ppt_第3页
第3页 / 共43页
第8章数据存储与访问课件.ppt_第4页
第4页 / 共43页
第8章数据存储与访问课件.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第8章数据存储与访问课件.ppt》由会员分享,可在线阅读,更多相关《第8章数据存储与访问课件.ppt(43页珍藏版)》请在三一办公上搜索。

1、第8章 数据存储与访问,本章学习目标:,掌握SharedPreferences的使用方法掌握各种文件存储的区别与适用情况掌握SQLite数据库的体系结构、建立和操作方法掌握ContentProvider的原理、创建与使用方法,8.1 简单存储,8.1.1 SharedPreferencesSharedPreferences是一种轻量级的数据保存方式以NVP(Name/Value Pair,名称/值对)保存SharedPreferences完全屏蔽了对文件系统的操作过程 调用SharedPreferences中的函数就可以实现对NVP的保存和读取 SharedPreferences访问权限私有(

2、MODE_PRIVATE):仅创建SharedPreferences的程序有权限对其进行读取或写入全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其它应用程序也具有读取操作的权限,但没有写入操作的权限全局写(MODE_WORLD_WRITEABLE):所有程序都可以对其进行写入操作,但没有读取操作的权限,8.1 简单存储,8.1.2 示例下面将通过SimplePreferenceDemo示例介绍SharedPreferences的文件保存位置和保存格式下图是SimplePreferenceDemo示例的用户界面,8.1 简单存储,8.1.2 示例Andro

3、id系统为每个应用程序建立了与包同名的目录,用来保存应用程序产生的数据文件,包括普通文件SharedPreferences产生的文件就保存在/data/data/shared_prefs目录下Demo中示例回退保存文件后出现 查看方式:命令行下, adb shell,8.1 简单存储,8.1.2 示例SaveSetting.xml文件是以XML格式保存的信息,内容如下,8.2 文件存储,8.2.1 内部存储存储在机器自带的存储空间里Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上保存地点:在Android系统下的/data/data/files目录中文件

4、操作方式:标准Java的IO类和方法Android流式文件操作方式openFileOutput() /写文件openFileInput() /读文件特点:限定文件的保存地点,适合小文件,8.2 文件存储,8.2.1 内部存储openFileOutput()如果指定的文件存在,直接打开文件准备写入数据如果指定的文件不存在,则创建一个新的文件格式:public FileOutputStream openFileOutput(String name, int mode)第1个参数是文件名称,这个参数不可以包含描述路径的斜杠第2个参数是操作模式,Android系统支持四种文件操作模式 函数的返回值是F

5、ileOutputStream类型,8.2 文件存储,8.2.1 内部存储openFileOutput文件模式,8.2 文件存储,8.2.1 内部存储openFileInput()格式:public FileInputStream openFileInput (String name) 参数是文件名称,不允许包含描述路径的斜杠使用openFileInput()函数打开已有文件,并以二进制方式读取数据的示例代码如下,8.2 文件存储,8.2.1 内部存储InternalFileDemo用户界面图,8.2 文件存储,8.2.2 外部存储文件保存于SD卡Micro SD卡使用FAT文件系统,不支持访

6、问模式和权限控制(安全性低)适合大容量文件可以指定SD卡中的文件存放位置需要SD卡的加载权限与写入权限文件保存在/mnt/sdcard (sdcard)目录下,8.2 文件存储,8.2.2 外部存储SDcardFileDemo用户界面图,8.2 文件存储,8.2.3 资源文件文件与项目在一起,位于项目/res/raw和/res/xml目录中的原始格式文件和XML文件操作原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件或数据文件等等在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变。而/res/xml目录下一般用来保存格式化数据的XML文件,则

7、会在编译和打包时将XML文件转换为二进制格式,用以降低存储器空间占用和提高访问效率,在应用程序运行的时候会以特殊的方式进行访问 资源文件有专门的类进行操作,8.2 文件存储,8.2.3 资源文件ResourceFileDemo示例演示了如何在程序运行时访问资源文件当用户点击“读取原始文件”按钮时,程序将读取/res/raw/raw_file.txt文件,并将内容显示在界面上,如下图所示,8.3 数据库存储,8.3.1 SQLite数据库SQLite是一个2000年由D.Richard Hipp发布的开源嵌入式关系数据库轻量级数据库SQLite的特点比传统数据库更适合用于嵌入式系统占用资源少,运

8、行高效可靠,可移植性强提供了零配置(zero-configuration)运行模式SQLite数据库的优势可以嵌入到使用它的应用程序中客户端和服务器在同一进程空间运行简化了数据库的管理过程,8.3 数据库存储,8.3.2 手动建库启动Android虚拟机AndroidSDK目录/platform-tools/下启动adb shellLinux命令提示符下输入sqlite3 启动sqlite常用命令,8.3 数据库存储,8.3.2 手动建库创建数据库命令:Sqlite3 peopleinfo 如果数据库存在则打开,不存在则创建Create语句创建表,8.3 数据库存储,8.3.2 手动建库.ta

9、bles命令,显示当前数据库中的所有表.schema命令查看建立表时使用的SQL命令,8.3 数据库存储,8.3.2 手动建库1sqlite insert into peopleinfo values(null,Tom,21,1.81);2sqlite insert into peopleinfo values(null,Jim,22,1.78);3sqlite insert into peopleinfo values(null,Lily,19,1.68);因为_id是自动增加的主键,因此在输入null后,SQLite数据库会自动填写该项的内容,8.3 数据库存储,8.3.2 手动建库.mo

10、de命令 支持:column格式,还支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式,8.3 数据库存储,8.3.3 代码操作在Android系统中,每个应用程序的SQLite数据库被保存在各自的/data/data/databases目录下缺省情况下,所有数据库都是私有的,仅允许创建数据库的应用程序访问,如果需要共享数据库则可以使用ContentProviderSQLiteOpenHelper,打开数据库SQLiteDatabase,执行SQL语句,完成数据查询与更新流程:创建数据表打开数据库插入,更新,删除,查询关闭数据库,8.3 数据库

11、存储,8.3.3 代码操作SQLiteDemo用户界面,8.3.3 代码操作SQLiteOpenHelper方法getReadableDatabase()会先以读写方式打开数据库,如果磁盘空间满了,数据库打开失败,会以只读打开,如果问题解决,只读对象就会关闭,返回可读写对象getWritableDatabase() 创建或打开一个可以读写的数据库,8.3 数据库存储,8.3.3 代码操作SQLiteOpenHelper运行机制如果数据库不存在,调用onCreat(),不调用onUpgrade();如果数据库存在,但是版本不一样,调用onUpgrade(),不调用onCreate();如果数据库

12、存在,版本也一样,调用onCreate() 和onUpgrade();当调用getWritableDatabase,getReadableDatabase如果数据库没有打开,就调用onOpen方法,如果打开了就不调onOpen; 数据库的表的创建一般都在SQLiteOpenHelper的onCreat()中,表字段升级,都会在onUpgrade()处理;,8.3 数据库存储,8.3.3 代码操作数据库操作insert(String table, String nullColumnHack, ContentValues values) /第二个参数一般为null,表示允许插入空值update(S

13、tring table, ContentValues values, String whereClause, String whereArgs)delete (String table, String whereClause, String whereArgs)Cursor query (String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit)execSQL()执行insert、delete、

14、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。,8.3 数据库存储,SQLiteDatabase,query参数说明,8.4 数据分享,8.4.1 ContentProviderAndroid应用程序运行在不同的进程空间中,不同应用程序的数据是不能够直接访问的ContentProvider是应用程序之间共享数据的一种接口机制,可以指定需要共享的数据,而其它应用程序则则可在不知道数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作ContentProvider完全屏蔽了数据提供组件的数据存储方法调用者无需知道数

15、据提供者的内部数据的存储方法,8.4 数据分享,8.4.1 ContentProvider调用者不能直接调用ContentProvider的接口函数,而需要使用ContentResolver对象,通过URI间接调用ContentProvider,调用关系如下图所示,8.4 数据分享,8.4.1 ContentProvider调用ContentResolver对象通过URI确定要访问的ContentProvider数据集URI是通用资源标志符(Uniform Resource Identifier),用来定位远程或本地的可用资源ContentProvider使用的URI语法结构如下1conten

16、t:/content:/是通用前缀,表示该URI用于ContentProvider定位资源授权者,确定哪个ContentProvider提供资源一般都由类的小写全称组成,以保证唯一性。是数据路径,用来确定请求的是哪个数据集,8.4 数据分享,8.4.1 ContentProvider调用如果请求的数据并不只限于一条数据,则是可以省略,例如 请求整个people数据集的URI应写为1 content:/edu.hrbeu.peopleprovider/people请求people数据集中第3条数据的URI则应写为1 content:/edu.hrbeu.peopleprovider/people

17、/3,8.4 数据分享,8.4.2 创建数据提供者ContentProvider程序开发人员通过继承ContentProvider类可以创建一个新的数据提供者,过程可以分为三步继承ContentProvider,并重载六个函数声明CONTENT_URI,实现UriMatcher注册ContentProvider,8.4 数据分享,8.4.2 创建数据提供者1. 创建ContentProvider,重载六个函数新建立的类继承ContentProvider后,共有六个函数需要重载,分别是delete():删除数据集insert():添加数据集qurey():查询数据集update():更新数据集o

18、nCreate():初始化底层数据集和建立数据连接等工作getType():返回指定URI的MIME数据类型如果URI是单条数据,则返回的MIME数据类型应以vnd.android.cursor.item开头如果URI是多条数据,则返回的MIME数据类型应以vnd.android.cursor.dir/开头,8.4 数据分享,8.4.2 创建数据提供者2. 声明CONTENT_URI和构造UriMatcher的代码如下,8.4 数据分享,8.4.2 创建数据提供者UriMatcher,识别来访者需要调用多条还是单数数据使用UriMatcher时,则可以直接调用match()函数,对指定的URI

19、进行判断,示例代码如下,8.4 数据分享,8.4.2 创建数据提供者3. 注册ContentProvider在完成ContentProvider类的代码实现后,需要在AndroidManifest.xml文件中进行注册注册ContentProvider使用标签,示例代码如下12 4在上面的代码中,注册了一个授权者名称为edu.hrbeu.peopleprovider的ContentProvider,其实现类是PeopleProvider,8.4 数据分享,8.4.3 使用数据提供者每个Android组件都具有一个ContentResolver对象,获取ContentResolver对象的方法是

20、调用getContentResolver()函数,8.4 数据分享,8.4.3 使用数据提供者查询操作在获取到ContentResolver对象后,程序开发人员则可以使用query()函数查询目标数据下面的代码是查询ID为2的数据,8.4 数据分享,8.4.3 使用数据提供者查询操作ContentResolver的query()函数语法结构如下1Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)uri定义了查询的数据集projection定义了从应返

21、回数据的哪些属性selection定义了返回数据的查询条件selectArgs,查询参数sortOrder查询结果排序,8.4 数据分享,8.4.3 使用数据提供者添加操作insert()函数,向ContentProvider中添加一条数据bultInsert()函数,批量的添加数据,8.4 数据分享,8.4.3 使用数据提供者删除操作使用delete()函数如果需要删除单条数据,则可以在URI中指定需要删除数据的ID如果需要删除多条数据,则可以在selection中声明删除条件1Uri uri = Uri.parse(CONTENT_URI_STRING + / + 2);2int resu

22、lt = resolver.delete(uri, null, null);也可以在selection将删除条件定义为ID大于4的数据1String selection = KEY_ID + 4;2int result = resolver.delete(CONTENT_URI, selection, null);,8.4 数据分享,8.4.3 使用数据提供者更新操作更新操作需要使用update()函数,参数定义与delete()函数相同,同样可以在URI中指定需要更新数据的ID,也可以在selection中声明更新条件,8.4 数据分享,8.4.4 示例ContentProviderDemo是一个无界面的示例,仅提供一个ContentProvider组件,供其它应用程序进行数据交换底层使用SQLite数据库,支持数据的添加、删除、更新和查询等基本操作ContentResolverDemo是调用ContentProvider的示例,自身不具有任何数据存储功能,仅是通过URI访问ContentProviderDemo示例提供的ContentProvider。界面如右图所示,该界面基本与示例界面相同,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号