zoukankan      html  css  js  c++  java
  • Android 数据存储04之Content Provider

    Content Provider

    版本

    修改内容

    日期

    修改人

    V1.0

    原始版本

    2013/2/25

    skywang

     

     

     

     

     

     

    1 URI

    通用资源标志符(Universal Resource Identifier, 简称"URI")。

    URI由许多部分所组成,示例及解说如下:

    2 Content URIs

    Content URIs就是Android遵照URI的标准,定义的一种专用的URI。Android提供了ContentUris、UriMatcher类来操作Content URIs。

    2.1 Content URIs说明

    Content URIs的语法如下:

    content://authority/path/id

    Content URIs的示例及说明如下:

    content:

    Content URIs前缀,它对应与标准URI的scheme。它的值为ContentResolver.SCHEME_CONTENT(即,content://)。

    authority

    一个唯一的标识符,Google建议使用类的全名来作为authority。外部调用者可以根据这个标识来找到它。

    path

    它可以用来表示我们要操作的数据,外部调用者根据这个路径信息来判断要返回什么类型的数据。这个后缀路径可以自由定义。

    id

    唯一的数字标识符。它表示要具体操作的数据类型中的具体某一项。

    2.2 Content URIs API说明

     

    2.3示例

    参考“3.3示例

    3 UriMatcher

    3.1 UriMatcher介绍

    UriMatcher用于匹配Uri。
    用法如下:
    (01)把你需要匹配Uri路径全部给注册上。
    (02)注册后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹。如果匹配就返回匹配码,匹配码是注册时调用 addURI()方法传入的第三个参数;否则,返回-1(即UriMatcher.NO_MATCH)。

    3.2 UriMatcher API说明

     

    3.3 示例

    View Code
    package com.yarin.Android.HelloAndroid; 
     
    import android.util.Log; 
    import android.app.Activity; 
    import android.content.ContentUris;   
    import android.content.UriMatcher;   
    import android.content.ContentResolver; 
    import android.net.Uri;   
    import android.os.Bundle;   
     
    public class HelloAndroid extends Activity { 
               
        private static final String TAG = "skywang-->HelloAndroid"; 
     
        private static final String AUTHORITY = "com.yarin.Android.HelloAndroid";   
        private static final String SCHEME_CONTENT = ContentResolver.SCHEME_CONTENT + "://" ; 
        private static final int PEOPLE = 1;   
        private static final int PEOPLE_ID = 2;   
           
        //NO_MATCH表示不匹配任何路径的返回码   
        private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);   
     
        static   
        {   
            uriMatcher.addURI(AUTHORITY, "people", PEOPLE); 
               
            //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本   
            uriMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID); 
        }   
           
        @Override   
        protected void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
               
            Uri uri = Uri.parse(SCHEME_CONTENT+ AUTHORITY + "/people"); 
            Uri uriAP = uri; 
            Log.d(TAG, "Uri=" + uri); 
            Log.d(TAG, "Uri.type=" + getType(uri)); 
               
            uri = Uri.parse(SCHEME_CONTENT + AUTHORITY + "/people" + "/2");   
            Log.d(TAG, "Uri=" + uri); 
            Log.d(TAG, "Uri.type=" + getType(uri)); 
               
            // 添加ID 
            uri = ContentUris.withAppendedId(uriAP, 15);   
            Log.d(TAG, "Uri=" + uri); 
            // 获取ID   
            long id = ContentUris.parseId(uri);   
            Log.d(TAG, "Uri ID: " + id);   
        }   
           
        private String getType(Uri uri) {   
            int match = uriMatcher.match(uri);   
            switch (match)   
            {   
                case PEOPLE:   
                    return "vnd.android.cursor.dir/person";   
                case PEOPLE_ID:   
                    return "vnd.android.cursor.item/person";   
                default:   
                    return null;   
            }   
        }   
    } 

    打印信息如下:

    D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people

    D/skywang-->HelloAndroid( 2131): Uri.type=vnd.android.cursor.dir/person

    D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people/2

    D/skywang-->HelloAndroid( 2131): Uri.type=vnd.android.cursor.item/person

    D/skywang-->HelloAndroid( 2131): Uri=content://com.yarin.Android.HelloAndroid/people/15

    D/skywang-->HelloAndroid( 2131): Uri ID: 15

    4 Content Provider

    4.1 Content Provider介绍

    如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。

    如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

    ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中ID部分。

    4.2 Content Provider示例

    代码地址:http://pan.baidu.com/share/link?shareid=305825&uk=3993336582

    说明:

    代码包括两部分(继承Content Provider的类的实现 和 它对应的测试类)

    第一部分源码:MyProvider/src/com/skywang/myProvider/MyProvider.java

                       MyProvider/src/com/skywang/myProvider/utils/Util.java

    第二部分源码:MyProvider/tests/src/com/test/MyProviderTests.java

    打印信息如下:

    D/skywang-->MyProvider( 3016): open/create table skywang_myprovider.db

    D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/1

    D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/2

    D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/3

    D/skywang-->MyProvider( 3016): insert uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): insert uri=content://com.skywang.myProvider/table_01/4

    D/skywang-->MyProviderTests( 3003): print all value!

    D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): printAll--0--, email=Jimmy20020201@126.com, username=Jimmy, date=20020201, sex=MAIL

    D/skywang-->MyProviderTests( 3003): printAll--1--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

    D/skywang-->MyProviderTests( 3003): printAll--2--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

    D/skywang-->MyProviderTests( 3003): printAll--3--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

    D/skywang-->MyProvider( 3016): query ITEM_ID id=2, uri=content://com.skywang.myProvider/table_01/2

    D/skywang-->MyProviderTests( 3003): querySecondItem--0--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

    D/skywang-->MyProvider( 3016): update ITEM_ID uri=content://com.skywang.myProvider/table_01/1, count=1

    D/skywang-->MyProviderTests( 3003): print all value!

    D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): printAll--0--, email=update_email, username=update_name, date=update_date, sex=update_sex

    D/skywang-->MyProviderTests( 3003): printAll--1--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

    D/skywang-->MyProviderTests( 3003): printAll--2--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

    D/skywang-->MyProviderTests( 3003): printAll--3--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

    D/skywang-->MyProviderTests( 3003): delete uri=content://com.skywang.myProvider/table_01/1

    D/skywang-->MyProvider( 3016): delete ITEM_ID id=1, uri=content://com.skywang.myProvider/table_01/1, count=1

    D/skywang-->MyProviderTests( 3003): print all value!

    D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): printAll--0--, email=kate20030104@163.com, username=Kate, date=20030104, sex=FEMAIL

    D/skywang-->MyProviderTests( 3003): printAll--1--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

    D/skywang-->MyProviderTests( 3003): printAll--2--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

    D/skywang-->MyProvider( 3016): delete ITEM uri=content://com.skywang.myProvider/table_01, count=1

    D/skywang-->MyProviderTests( 3003): print all value!

    D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

    D/skywang-->MyProviderTests( 3003): printAll--0--, email=lilei20101124@gmail.com, username=Li Lei, date=20021124, sex=MAIL

    D/skywang-->MyProviderTests( 3003): printAll--1--, email=lucy20101124@gmail.com, username=Lucy, date=20010624, sex=FEMAIL

    D/skywang-->MyProviderTests( 3003): delete all value!

    D/skywang-->MyProvider( 3016): delete ITEM uri=content://com.skywang.myProvider/table_01, count=2

    D/skywang-->MyProviderTests( 3003): print all value!

    D/skywang-->MyProvider( 3016): query ITEM uri=content://com.skywang.myProvider/table_01

     参考文献:

    1,Android API文档

    2,contentprovider的学习实例总结:http://www.cnblogs.com/chenglong/articles/1892029.html

    3,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html

  • 相关阅读:
    applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.
    HTML
    c# Path路径类
    C# 继承
    C# 结构体
    c# 类
    c#方法
    wpf开源控件MahApps.Metro
    c#数组类型
    c#类型转换
  • 原文地址:https://www.cnblogs.com/skywang12345/p/2937981.html
Copyright © 2011-2022 走看看