第七章 数据存储_第1页
第七章 数据存储_第2页
第七章 数据存储_第3页
第七章 数据存储_第4页
第七章 数据存储_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章第七章 Android中的数据存储中的数据存储倚动软件工厂实验室倚动软件工厂实验室 主要内容主要内容主要内容主要内容概述概述 一个应用程序,经常需要与用户进行交互,需要保存用户的设置和用户数据,这些都离不开数据的存储。Android系统提供了以下五种主要的数据存储方式。u文件存储:文件存储:以数据流的方式存储数据;用于存取一些数据量较大的数据,可以是手机存储器或外存储器上的数据。 uSharedPreferences:以键值对的形式存储简单数据;用于保存一些简单类型的数据,如用户配置或参数信息。uSQLite数据库:数据库:以数据库的方式存储结构化数据;用于保存结构较为复杂的数据,SQL

2、ite是Android系统内置的一个轻量级的数据库,没有后台进程,整个数据库对应一个文件。概述概述uContentProvider:用于在应用程序间共享数据;是Android提供的一种将私有数据共享给其他应用程序的方式。u网络存储:网络存储:从网络中读取,传送数据;可以通过网络下载资源,或上传资源。文件存取文件存取uAndroid系统基于Java语言,在Java语言中提供了一套完整的输入输出流操作体系,与文件有关的FileInputStream、FileOutputStream等,通过这些类可以方便的访问磁盘上的文件。Android除了支持这些方式来访问手机上的文件外,还提供了专门的输入输出A

3、PI,用于更有效的输入、输出操作。uAndroid手机中的文件有两个存储位置:内置存储空间和外部SD卡,相应的存储方式稍有不同。uAndroid中文件的读取操作主要通过Context类来完成,该类提供了两种方法来打开文件夹里的文件IO流。文件存取文件存取DiagramContext提供了如提供了如下两个方法来打下两个方法来打开本应用程序的开本应用程序的数据文件夹里的数据文件夹里的文件文件IO流。流。 FileInputStream openFileInput(String name):打开打开应用程序的数据文件夹下的应用程序的数据文件夹下的name文件对应输入流。文件对应输入流。 FileOu

4、tputStream openFileOutput(String name, int mode):打开应用程序的数据文件夹打开应用程序的数据文件夹下的下的name文件对应输出流。文件对应输出流。 第一参数用于指定文件名称,不能包含路径分隔符第一参数用于指定文件名称,不能包含路径分隔符“/” ,如,如果文件不存在,果文件不存在,Android 会自动创建它会自动创建它。 第二参数用于指定操作模式,有四种模式。第二参数用于指定操作模式,有四种模式。文件存取文件存取-四种操作模式四种操作模式uContext.MODE_PRIVATE=0:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该

5、模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND 。uContext.MODE_APPEND=32768:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件再写入内容; uContext.MODE_WORLD_READABLE =1:表示当前文件可以被其他应用读取;uContext.MODE_WORLD_WRITEABLE =2:表示当前文件可以被其他应用写入。文件存取文件存取-四种操作模式四种操作模式如果希望文件被其他应用读和写,可以传入如果希望文件被其他应用读和写,可以传入:Context.MODE_WOR

6、LD_READABLE + Context.MODE_WORLD_WRITEABLE或者直接传入数值或者直接传入数值3也可以。这也可以。这4种模式除了种模式除了Context.MODE_APPEND外,其他都会覆盖掉原文件的内外,其他都会覆盖掉原文件的内容。容。 应用程序的数据文件默认保存在应用程序的数据文件默认保存在/data/data/files目录下,文件的后缀名随意。目录下,文件的后缀名随意。文件存取步骤文件存取步骤在手机上创建文件和向文件中追加内容的步骤如下:(1)调用openFileOutput()方法,传入文件的名称和操作的模式,该方法将返回一个文件输出流;(2)调用write(

7、)方法,向这个文件输出流中写入内容;(3)调用close()方法,关闭文件输出流。文件存取步骤文件存取步骤读取手机文件的一般步骤如下:(1)调用openFileInput()方法,传入需要读取数据的文件名称,该方法将返回一个文件输入流;(2)调用read()方法读取文件的内容;(3)调用close()方法,关闭文件输入流。案例案例 单击write按钮,将第一个文本编辑框(writeText)的内容写入到指定的文件中(content.txt),单击read按钮, 从指定的文件中(content.txt)读取数据并显示在第二个文本框(readText)上。【示例练习示例练习:codes07File

8、Test】问题与讨论问题与讨论 1、当我们手机上不存在该文件时,我们先写后读与先读后写有区别吗?程序会不会出错? (具体做法:把手机上的content.txt文件删除,然后分别进行先写后读与先读后写操作,观察效果)。 2、不同操作模式的区别,当我们多次执行写入操作时, 文件里的内容是被覆盖还是不断的在文件末尾附加新数据?(具体做法:修改openFileOutput()方法的第二个参数)。SD卡文件存取卡文件存取 使用openFileOutput()方法保存文件,文件是存放在手机上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放视频类的大文件,则不行。对于像视频这样的大文件,可以把它存

9、放在SDCard上。 SDCard是什么?可以把它看作是移动硬盘或移动硬盘或U U盘盘。 读取SD卡上的文件和读取手机上的文件类似,都是采用文件操作流的方式进行读取,Android没有提供单独的SD卡文件操作类,直接使用Java中的文件操作即可。 在访问SD卡之前,需要验证手机的SD卡状态,Android为我们提供了Environment类来完成这一操作。SD卡文件存取卡文件存取 在模拟器中使用SDCard,需要先创建一张SDCard卡(只是镜像文件)。SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下: 在Dos窗口中进入android SDK安装路径的

10、tools目录,输入以下命令创建一张容量为100M的SDCard,文件后缀名可以文件后缀名可以自取自取,建议使用.img:mksdcardmksdcard 100100M M d d:sdcard.img:sdcard.img 在模拟器中加载SD卡的命令为:emulator emulator avdavd avdnameavdname sdcardsdcard d:sdcard.imgd:SD卡文件存取卡文件存取读、写读、写SDSD卡上的文件步骤如下:卡上的文件步骤如下:1、调用EnvironmentEnvironment的的getExternalStorageStategetExternal

11、StorageState()()方法判断手机上是否插入了SD卡,并且应用程序具有读写SD卡的权限。 Environment.getExternalStorageStateEnvironment.getExternalStorageState()()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTEDEnvironment.MEDIA_MOUNTED。2、调用Environment的getExternalStorageDirectorygetExternalStorageDirectory()()方法

12、来获取外部存储器,也就是SD卡的目录。 3、使用FileInputStreamFileInputStream、FileOutputStreamFileOutputStream、FileReaderFileReader、FileWriterFileWriter读、写SD卡里的文件。SD卡文件存取卡文件存取文件读取之前,应确认手机上已插入SD卡,对于模拟器来说,可以通过mksdcard命令来创建虚拟存储卡;为了读、写SD卡上的数据,必须在应用程序的清单文件。(AndroidManifest.xml)中添加读、写添加读、写SD卡的权限卡的权限。【前例修改前例修改:FileWReTest】注意事项注意

13、事项注意:注意:例子中向文件写入内容时,使用到了Java的RandomAccessFileRandomAccessFile类,该类支持随机访问文件内容,主要是通过seek方法来设定文件指针的位置,每次读写内容时,都是从该指针处开始进行读取的,从而实现了随机访问文件内容的功能。该类还有一个特点,就是既可以读,也可以写,创建时需指定它的读写模式。而raf.seek(destFile.lengthraf.seek(destFile.length()()用于将文件的指针定位到文件的末尾,实现将新内容附加到文件的目的。如果没有这句代码,多次向文件中写入内容时,后写的内容会替换前面的内容。读取操作时,采用

14、的是简单的文件输入输出流,每次都是读取整个文件内容。SD卡文件存取卡文件存取应用程序的数据文件保存在应用程序的数据文件保存在/mnt/sdcard目录下。目录下。SharedPreferences 通常应用程序都需要为用户提供设置参数功能,对于软件配置参数的保存,windows软件一般会采用ini文件进行保存;在Java里,我们可以采用properties属性文件或者xml文件进行保存。类似的,Android平台为我们提供了SharePreferencesSharePreferences接口,来进行一些轻量级的存储。 SharedPreferences是一个接口,应用程序使用该接口可以快速而高

15、效的以键值对的形式保存数据,非常类似于Bundle。信息以XMLXML文件文件的形式存储在android设备上。 SharedPreferences SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口Editor,SharedPreferencesSharedPreferences调用edit()edit()方法即可获取它对应的Editor对象。 Shared Preferences本身是一个接口,不能直接实例化,只能通过Context提供的getSharedpreferences(String name, int mode

16、)方法来获取SharedPreferences实例。第一个参数表示保存信息的文件名,不需要后缀,第二个参数表示访问权限,有Context.MODE_PRIVATEContext.MODE_PRIVATE;Context.MODE_WORLD_READABLEContext.MODE_WORLD_READABLE ;Context.MODE_WORLD_WRITEABLEContext.MODE_WORLD_WRITEABLE以及MODE_MULTI_PROCESSMODE_MULTI_PROCESS 。 SharedPreferences SharedPreferences数据总是保存在 /d

17、ata/data/shared_prefs目录下, SharedPreferences数据总是以XML格式保存。案例案例 该程序实现保存用户登录信息的功能,用户第一次登录时可设置是否记录密码和是否自动登录。如果用户勾选记住密码复选框,则下次登录时,会直接显示用户名和密码,用户只需单击登录即可。【示例代码示例代码:codes07SaveLoginInfo 】注意注意文本文本文本在在data/data文件夹下生成的目录结构如下:文件夹下生成的目录结构如下:123456zhangsanlogin.xml文件的内容文件的内容读写其它应用读写其它应用SharedPreferences getShared

18、Preferences(StringgetSharedPreferences(String name,intname,int mode) mode)方法中,第二个参数可设置该SharedPreferences是否可被其他应用程序读写,前提是创建该SharedPreferences的应用程序指定了相应的访问权限。主要步骤如下:1、需要创建其他程序对应的Context。(Android系统是根据应用程序的包名来作为该程序的标识的)2、调用其他应用程序的Context的getSharedPreferences(String name,int mode)即可获取相应的SharedPreferences

19、对象;3、如果需要向其他应用的SharedPreferences数据写入数据,调用SharedPreferences的edit()方法获取相应的Editor即可。【实例练习实例练习:ReadOtherSharedPreferences】SQLite数据库存储数据数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库SQLite,SQLite支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上SQLite也接受varchar(n)可变、char(n)、decimal(p,s) 等数据类型,只

20、不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。 但有一种情况例外:定义为定义为INTEGER PRIMARY KEY的字段的字段只能存储只能存储64位整数,位整数, 当向这种字段保存除整数以外的数据时,将当向这种字段保存除整数以外的数据时,将会产生错误。会产生错误。 SQLite数据库存储数据数据库存储数据 SQLite允许存入数据时忽略底层数据列的实际数据类型,因此SQLite在解析建表语句时,会忽略建表语句中跟在字段名后面的数据类型信息,如下面语句会忽略name字段的类型信息:create t

21、able create table person_tb(idperson_tb(id integer primary key integer primary key autoincrementautoincrement, , name varchar(20)name varchar(20)。 因此,在编写建表语句时,我们可以省略数据列后面的类型声明。常用的常用的SQL标准语句标准语句查询语句:查询语句:select * from 表名 where 条件子句 group by 分组字句 having . order by 排序子句 如:select * from person select na

22、me from person group by name having count(*)1 select * from Account limit 5 offset 3 插入语句插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(传智,3)更新语句:更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=传智 where id=10删除语句:删除语句:delete from 表名 where 条件子句。如:delete fro

23、m person where id=SQLite数据库相关类数据库相关类 Android系统为我们提供了一些操作和管理数据库的相关类,常用的有SQLiteOpenHelper、SQLiteDataBase、Cursor,与数据库相关类都在android.database.sqlite包和android.database包之下。 SQLiteOpenHelper是Android提供的管理数据的工具类,主要用于数据库的创建、打开和版本更新。一般用法是创建SQLiteOpenHelper类的子类,并扩展它的onCreate()和onUpgrade()方法(这两个方法是抽象的,必须扩展),有选择性的扩

24、展它的onOpen()方法。 SQLiteOpenHelper类类SQLiteOpenHelper类的常用方法:SQLiteDatabase getReadableDatabase():以读写的方式打开SQLiteDatabase对象,该方法内部调用getWritableDatabase()方法;SQLiteDatabase getWritableDatabase ():以写的方式打开SQLiteDatabase对象,一旦打开成功,将会缓存该数据库对象;abstract void onCreate (SQLiteDatabase db):当数据库第一次被创建的时候调用该方法;abstract

25、void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion):当数据库需要更新的时候调用该方法;void onOpen(SQLiteDatabase db):当数据库打开时调用该方法。SQLiteOpenHelper类类 当调用SQLiteOpenHelper类的getReadableDatabase()或 getWritableDatabase ()获取SQLiteDatabase实例时,如果数据库不存在,Android系统会自动生成一个数据库,然后调用onCreate()方法,在onCreate()方法里可以生成数据库

26、表结构及添加一些应用需要初始化的数据。SQLiteDatabase类类 SQLiteDatabase是Android提供的代表数据库的类(底层就是一个数据库文件),该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作。对SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和create table之类有更新行为的SQL语句;而rawQuery()方法用于执行select语句。SQLi

27、teDatabase类类SQLiteDatabase类的常用方法:execSQL(String sql,Object bindArgs):执行带占位符的SQL语句,如果sql语句中没有占位符,则第二个参数可传null;execSQL(String sql):执行SQL语句;rawQuery(String sql,String selectionArgs):执行带占位符的SQL查询。除了execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应的:insert()、delete()、update()和query()方法。但这些方法都可由execSQL()和raw

28、Query()方法替代。SQLiteDatabase类类table表名相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开columns要查询出来的列名相当于select语句select关键字后面的部分selection查询条件子句相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”limit指定偏移量和获取的记录数相当于select语句limit关键字后面的部分groupBy相当于select语句group by关键字后面的部分having相当于select语句having关键字后面的部分orderBy相当于select语句

29、order by关键字后面的部分selectionArgs对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。例如:query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:Cursor接口接口 Cursor接口主要用于存放查询记录的接口,Cursor是结果集游标,用于对结果集进行随机访问,如果熟悉JDBC,可发现Cursor与JDBC中的ResultSet作用很相似,提供了如下方法来移动查询结果的记录指针。 Cursor

30、接口的常用方法:move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就向下移动,为负数就向上移动;moveToNext()方法可以将游标从当前记录移动到下一记录,如果已经移过了结果集的最后一条记录,返回结果为false,否则为true;Cursor接口接口 Cursor接口的常用方法:moveToPrevious()方法用于将游标从当前记录移动到上一记录,如果已经移过了结果集的第一条记录,返回值为false,否则为true ;moveToFirst()方法用于将游标移动到结果集的第一条记录,如果结果集为空,返回值为false,否则为true ;moveToL

31、ast()方法用于将游标移动到结果集的最后一条记录,如果结果集为空,返回值为false,否则为true。数据库操作的一般步骤数据库操作的一般步骤使用SQLiteDatabase进行数据库操作的步骤如下:获取SQLiteDatabase对象,它代表了与数据库的连接;调用SQLiteDatabase的方法来执行SQL语句;操作SQL语句的执行结果;关闭SQLiteDatabase,回收资源。备忘录案例 该程序实现备忘录功能,用于记录生活中的一些重要事情,并提供查询功能,可按条件进行模糊查询。可输入主题、相关内容以及选择时间 ,单击添加按钮时,会将相关数据写入数据库,单击查询按钮时,会根据主题、内容

32、以及时间进行精确和模糊查询。 【示例代码示例代码:codes07 Memento 】备忘录案例 数据库文件位于数据库文件位于/data/data/你的程序的包名你的程序的包名/databases/中中,可通过DDMS工具将该文件夹下的数据库导出来,然后下载具体的图形化界面进行查看。关键代码文本 Android为我们提供了一个相应的命令行工具查看SQLite数据库。进入到数据库所在目录(你导出来的文件所放文件夹),sqlite3 数据库名进入到该数据库然后即可利用sql语句查找相关信息。 注意:注意:通过命令行查看数据库内容时,中文在命令行上会显示乱码。 问题与讨论问题与讨论(Android系统

33、在调用SQLiteOpenHelper的getReadableDatabase()方法时会判断系统中是否已存在数据库,如果不存在,系统会创建数据库文件,因此查找记录时不会出错,只不过查询结果为空。但若我们在创建数据库时,没有指定表结构,添加或查询时会出错)1、数据库的创建过程是怎么样的?当不存在数据库时,直接查找记录会不会出错?2、数据库的后缀名有要求吗?(后缀名可任意)ContentProvider共享数据共享数据 随着我们手机上应用的增多,往往在不同的应用之间需要共享数据,比如现在有一个短信群发的应用,用户需要选择收件人,这时候就需要获取联系人应用的数据,然后从中选择收件人即可。 对于应用

34、之间数据的共享,我们可以在一个应用中直接操作另一个应用所记录的数据,比如前面所学的文件、SharedPreferences或数据库等,但这不仅需要应用程序提供相应的权限,而且还必须知道应用程序中数据存储的细节,不同应用程序记录数据的方式差别也很大,不利于数据的交换。针对这种情况,Android提供了ContentProvider,它是不同应用程序间共享数据的标准API,统一了数据访问方式。ContentProvider共享数据共享数据 ContentProvider以某种URI的形式对外提供数据,数据以类似数据库中表的方式暴露,允许其他应用访问或修改数据,其他应用程序使用ContentReso

35、lver根据URI去访问操作指定的数据。 URI是通用资源标识符,即每个ContentProvider都有一个唯一标识的URI,其他应用程序的ContentResolver根据URI就知道具体解析的是哪个ContentProvider,然后调用相应的操作方法,而ContentResolver的方法内部实际上是调用该ContentProvider的对应方法,而ContentProvider方法内部是如何实现的,其他应用程序是不知道具体细节的。对于不同的数据的存储方式,该方法内部的实现是不同的,而外部访问方法都是一致的。ContentProvider共享数据共享数据 ContentProvider

36、也是Android四大组件之一,如果要开发自己的ContentProvider必须实现Android系统提供的ContentProvider基类,并且需要在AndroidManifest.xml文件中进行配置。1、继承继承ContentProvider并重写增、删、查、改等方法;2、在在AndroidManifest.xml使用对该ContentProvider进行配置配置。 注意:注意:authorities是必备属性,如果没有是必备属性,如果没有authorities属性会报错。属性会报错。ContentProvider常用方法upublic abstract boolean onCrea

37、te():该方法在ContentProvider创建后调用,当其他应用程序第一次访问ContentProvider时,ContentProvider会被创建,并立即调用该方法;upublic abstract Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder):根据Uri查询符合条件的全部记录,其中projection是所需要获取的数据列;upublic abstract int update(Uri uri, ContentValues value

38、s, String select, String selectArgs):根据Uri修改select条件所匹配的全部记录;ContentProvider常用方法upublic abstract int delete(Uri uri, String selection, String selectionArgs):根据Uri删除符合条件的全部记录;upublic abstract Uri insert(Uri uri, ContentValues values):根据Uri插入values对应的数据,ContentValues类似于map,存放的是键值对;upublic abstract Str

39、ing getType(Uri uri):该方法返回当前Uri所代表的数据的MIME类型。如果该Uri对应的数据包含多条记录,则MIME类型字符串应该以vnd.android.curor.dir/开头,如果该Uri对应的数据只包含一条记录,则MIME类型字符串应该以vnd.android.cursor.item/开头。Uri组成 Uri代表了要操作的数据,Uri主要包含了两部分信息: 1、需要操作的ContentProvider ; 2、对ContentProvider中的什么数据进行操作。 一个Uri由以下几部分组成: ContentProvider(内容提供者)的scheme已经由Andr

40、oid所规定, scheme为:content:/ 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:u要操作要操作person表中表中id为为10的记录,可以构建这样的路径的记录,可以构建这样的路径:/person/10u要操作要操作person表中表中id为为10的记录的的记录的name字段,字段, person/10/nameu要操作要操作person表中的所有记录,可以构建这样的路径表中的所有记录,可以构建这样的路径:/personu要操作要

41、操作xxx表中的记录,可以构建这样的路径表中的记录,可以构建这样的路径:/xxx 当然要操作的数据不一定来自数据库,也可以是文件、当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式或网络等其他存储方式Uri组成 如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下: Uri uri = Uri.parse(content:/vider.personprovider/person); 因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为U

42、riMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。Uri操作常用类介绍-UUri操作常用类介绍-UriMatcher UriMatcher类用于匹配Uri,它的用法如下: 1、注册所有需要匹配的Uri路径:UriMatcherUriMatcher myUrimyUri= new = new UriMatcher(UriMatcher.NO_MATCHUriMatcher(UriMatcher.NO_MATCH););/创建UriMather对象,常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码,该常量值为-1.myUri.addURI(“

43、.providers.myprovidermyUri.addURI(“.providers.myprovider”, “person”, ”, “person”, 1);1);/添加需匹配的Uri,如果match()方法匹配content:/.providers.myprovider/person路径,返回匹配码为1myUri.addURI(“.providers.myprovidermyUri.addURI(“.providers.myprovider”, ”, “person/#”, 2);“person/#”, 2);/添加需匹配的Uri,#号为通配符,表示匹配任何ID的Uri,如果匹配

44、则返回2,/例如如果match()方法匹配content:/.providers.myprovider/person/230/路径,返回匹配码为Uri操作常用类介绍-UriMatcher 2、注册完需要匹配的Uri后,就可以使用myUri.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content:/ .providers.myprovider/person路径,返回的匹配码为1。 ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法: withAppendedId(uri, id)

45、用于为路径加上ID部分: Uri uri = Uri.parse(content:/vider.personprovider/person) Uri resultUri = ContentUris.withAppendedId(uri, 10); /生成后的Uri为:content:/vider.personprovider/person/10 parseId(uri)方法用于从路径中获取ID部分: Uri uri = Uri.parse(content:/vider.personprovider/person/10

46、) long personid = ContentUris.parseId(uri);/获取的结果为:10Uri操作常用类介绍-ContentU ContentProvider的作用是暴露可供操作的数据,其他应用程序主要通过ContentResolver来操作ContentProvider所暴露的数据,ContentResolver相当于我们的客户端。 ContentResolver是一个抽象类,是不能直接实例化的,那么我们如何得到ContentResolver实例呢?Android中Context类提供了getContentResolver()方法用于获取ContentResolver对象。

47、然后即可调用其增删查改方法进行数据操作。 ContentResolver操作类介绍操作类介绍ContentResolver常用方法常用方法u query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder):查询Uri对应的ContentProvider中符合条件的全部记录,其中projection是所需要获取的数据列;u update(Uri uri, ContentValues values, String select, String selectArgs):更新Uri对

48、应的ContentProvider中符合select条件所匹配的全部记录;ContentResolver常用方法常用方法u delete(Uri uri, String selection, String selectionArgs):删除Uri对应的ContentProvider中符合条件的全部记录;u insert(Uri uri, ContentValues values):向Uri对应的ContentProvider中插入values对应的数据,ContentValues类似于map,存放的是键值对; 一般来说,ContentProvider是单例模式的,当多个应用程序通过Conten

49、tResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。使用ContentResolver操作数据的步骤步骤: 调用Activity的getContentResolver()获取ContentResolver对象; 根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。ContentResolver操作类介绍操作类介绍 ContentProvider操作常用类介绍操作常用类介绍 ContentValues类类和 Ja

50、va中的Hashtable类比较相似,都是负责存储一些键值对,但是它存储的键值对当中的键是一个String类型,往往是数据库的某一字段名,而值都是一些简单的数据类型。当我们向数据库中插入一条记录时,可以将这条信息的各个字段值放入ContentValues,然后将该ContentValues直接插入数据库。而不用拼接SQL语句或使用占位符一一赋值。案例案例文本调用系统联系人调用系统联系人ContentProvider 通过ContentResolver去操作系统的联系人数据,将输入的用户名和手机号添加到联系人应用中,单击显示所有联系人号码,能够读取所有的联系人信息。【示例代码示例代码:codes07 AccessContacts】案例案例为备忘录添加为备忘录添加ContentProvider下面以一个具体的示例演示如何创建自己的ContentProvider,我们为备忘录示例创建ContentProvider,使得其他应用程序可以访问和修改它的数据 【示示例代码例代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论