zoukankan      html  css  js  c++  java
  • ContentProvider与ContentResolver使用

    例如以下内容为从网络转载:
    使用ContentProvider共享数据:
    当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其它应用共享其数据。虽然使用其它方法也能够对外共享数据,但数据訪问方式会因数据存储的方式而不同,如:採用文件方式对外共享数据,须要进行文件操作读写数据;採用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.provider.personprovider"/>
        </application>
    </manifest>
    注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
    l
    Uri介绍:
    Uri代表了要操作的数据,Uri主要包括了两部分信息:1》须要操作的ContentProvider 2》对ContentProvider的什么数据进行操作,一个Uri由下面几部分组成:
    l
    ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
    主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者能够依据这个标识来找到它。
    路径(path)能够用来表示我们要操作的数据,路径的构建应依据业务而定,例如以下:
    要操作person表中id10的记录,能够构建这种路径:/person/10
    要操作person表中id10的记录的name字段, person/10/name
    要操作person表中的全部记录,能够构建这种路径:/person
    要操作xxx表中的记录,能够构建这种路径:/xxx
    当然要操作的数据不一定来自数据库,也能够是文件等他存储方式,例如以下:
    要操作xml文件里person节点下的name节点,能够构建这种路径:/person/name
    假设要把一个字符串转换成Uri,能够使用Uri类中的parse()方法,例如以下:
    Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

    lUriMatcher类使用介绍:
    由于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
    lContentUris类使用介绍:
    ContentUris类用于获取Uri路径后面的ID部分,它有两个比較有用的方法:
    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
    l使用ContentProvider共享数据:
    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记录的Uricontent://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。假设要操作的数据属于单一数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,比如:得到id10person记录,Uricontent://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person
    l使用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.provider.personprovider/person/10”),那么将会对主机名为cn.itcast.provider.personproviderContentProvider进行操作,操作的数据为person表中id10的记录

    l使用ContentResolver操作ContentProvider中的数据:
    使用ContentResolverContentProvider中的数据进行加入、删除、改动和查询操作:
    ContentResolver resolver =  getContentResolver();
    Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
    //加入一条记录
    ContentValues values = new ContentValues();
    values.put("name", "itcast");
    values.put("age", 25);
    resolver.insert(uri, values);
    //获取person表中全部记录
    Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
    while(cursor.moveToNext()){
    Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
    }
    //id1的记录的name字段值更改新为liming
    ContentValues updateValues = new ContentValues();
    updateValues.put("name", "liming");
    Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
    resolver.update(updateIdUri, updateValues, null, null);
    //删除id2的记录
    Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
    resolver.delete(deleteIdUri, null, null);
     
    AndroidManifest.xml:
    <provider android:name="PersonContentProvider"
    android:authorities="com.gao.provider.personprovider" />
    在还有一个程序ContentProviderUser中使用上面的内容提供者:
     
  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4046743.html
Copyright © 2011-2022 走看看