`
mmdev
  • 浏览: 12922064 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

android数据存储与访问之使用ContentProvider

 
阅读更多

ContentProvider简介及其好处

简介:

ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider 对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。

好处:

使用ContentProvider对外共享数据的好处是统一了数据的访问方式。



当应用需要通过ContentProvider对外共享数据时第一步需要继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

public String getType(Uri uri)}


第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
<manifest .... >
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name=".PersonContentProvider" android:authorities="cn.itcast.providers.personprovider"/>
</application>
</manifest>


Uri介绍;

Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:


ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)
用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

1.1 要操作person表中id为10的记录,可以构建这样的路径:/person/10
1.2 要操作person表中id为10的记录的name字段, person/10/name
1.3 要操作person表中的所有记录,可以构建这样的路径:/person
1.4 要操作xxx表中的记录,可以构建这样的路径:/xxx

1.5要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

1.6如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")


UriMatcher类使用介绍:

因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。


UriMatcher类用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路径全部给注册上,如下:


//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符


switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {
case 1
break;
case 2
break;
default://不匹配
break;
}
注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.itcast.provider.personprovider/person路径,返回的匹配码为1

ContentUris类使用介绍:

withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);

//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10


使用ContentProvider共享数据;

public boolean onCreate()
该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。


public Uri insert(Uri uri, ContentValues values)
该方法用于供外部应用往ContentProvider添加数据。


public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于供外部应用从ContentProvider删除数据。


public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于供外部应用更新ContentProvider中的数据。


public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于供外部应用从ContentProvider中获取数据。


public String getType(Uri uri)
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。

使用ContentResolver操作ContentProvider中的数据:

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values)
该方法用于往ContentProvider添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于从ContentProvider中获取数据。

这些方法的第一个参数为Uri,代表要操作的ContentProvider和对其中的什么数据进行操作,假设给定的是: Uri.parse(“content://cn.itcast.providers.personprovider/person/10”),那么将会对主机名为cn.itcast.providers.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录。

分享到:
评论

相关推荐

    Android数据存储和访问实验报告

    1.掌握SharedPreferences的使用方法; 2.掌握各种文件存储的区别与适用情况;...6.掌握ContentProvider的创建与使用方法。 源码和整个工程会上传到博客中,若有需要可下载。 该实验报告包含部分源码,和内容介绍。

    android数据存储与访问

    数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的4种方式,分别是:1 使用SharedPreferences存储数据;2 文件存储数据;3 SQLite数据库存储数据;4 使用ContentProvider存储数据;

    Android数据存储与访问

    1、简单存储 2、建立存储设置界面 3、文件存储 4、数据库存储 各种内部储存、外部储存、数据库储存方法,掌握SharedPreferences的使用方法;各种文件存储的区别与适用情况;...ContentProvider的创建与使用方法。

    基于Android ContentProvider的总结详解

    1.适用场景1) ContentProvider为存储和读取数据提供了...虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferen

    八、数据存储与访问 Android开发与实践

    1. SharedPreferences(配置) 2. 文件存储 3. SQLite数据库 4. ContentProvider

    Android开发教程之ContentProvider数据存储

    那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的“数据库”。 ContentProvider提供了一种多应用间数据共享的方式。 ContentProvider是个实现了一组...

    contentprovider

    当应用继承ContentProvider类 并重写该类用于提供数据和存储数据的方法 就可以向其他应用共享其数据 虽然使用其他方法也可以对外共享数据 但数据访问方式会因数据存储的方式而不同 如:采用文件方式对外共享数据 ...

    Android 实例分析ContentProvider详解

    ContentProvider是android的四大组件之一,同时与SharedPreferences、IO、SQLite、网络共同构成了五种android存储技术。是android定义的一个管理访问结构化数据机制。android支持的Sqlite是不支持跨进程、跨应用访问...

    android数据存储

    详细的介绍了android数据存储的几种方式:xml存储,io数据存储,文件系统,sdcard访问(详细的步骤),sqlite访问(详细的步骤以及相关的sqlite知识点),ContentProvider,很有参考价值!!!

    Android数据存储和数据访问

    创建test.db的数据库,并建立staff数据表,建立ContentProvider

    Android编程使用内容提供者方式(ContentProvider)进行存储的方法

    本文实例讲述了Android编程使用内容提供者方式进行存储的方法。分享给大家供大家参考,具体如下: 内容提供者(ContentProvider)主要作用是对外共享数据,如果数据通过内容提供者对外共享了,那么其他应用就可以从...

    ContentProvider使用

    SQLite存储数据,ContentProvider以Uri的形式对外提供数据的访问操作接口,对外暴露数据,其他应用则通过ContentResolver根据Uri去访问指定的数据

    Android入门到精通源代码.

    第9章 Android中的数据存储 9.1 使用Preferences存储数据 9.1.1 访问Preferences的API 9.1.2 使用XML存储Preferences数据 9.2 使用文件存储数据 9.2.1 访问应用中的文件数据 9.2.2 访问设备中独立的文件数据 9.3 ...

    疯狂Android讲义源码

     第8章 Android的数据存储和IO 306  8.1 使用SharedPreferences 307  8.1.1 SharedPreferences与Editor  简介 307  8.1.2 SharedPreferences的存储  位置和格式 308  8.1.3 读、写其他应用Shared  ...

    android应用安全——数据安全

    数据安全包含数据库数据安全、...使用SQLiteOpenHelper操作数据库时,数据库存放在data/data//databases/目录,这个目录只能是应用自己访问,相对是安全的,但是root用户,这个目录也是透明的,因此,私密数据也要做到

    Android小程序实现访问联系人

    ContentProvider(内容提供器)是所有应用程序之间数据存储和检索的一个桥梁,其作用是是各个应用程序之间能共享数据;主要功能是存储、检索数据并向应用程序提供访问数据的接口。 基本操作: 查询:使用...

    自定义ContentProvider

    ContentProvider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,ContentProvider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。

    Android实例代码

    第8章、Android的数据存储和IO 8.1、使用SharedPreferences:SharedPreferences; Editor; 8.2、File存储:openFileOutput和openFileInput; 读写SD卡文件; 8.3、SQLite数据库:SQL语句; SQLiteDatabase; ...

    疯狂Android讲义.part2

    第8章 Android的数据存储和IO 306 8.1 使用SharedPreferences 307 8.1.1 SharedPreferences与Editor 简介 307 8.1.2 SharedPreferences的存储 位置和格式 308 8.1.3 读、写其他应用Shared Preferences 310 8.2 File...

Global site tag (gtag.js) - Google Analytics