Android ContentProvider的实现及简单实例代码

一、概念及说明

ContentProvider定义:

内容提供者是一个Android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了ContentProvider(视频、音频),ContentProvider使用表的形式来组织数据。

URI定义:

每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。android所提供ContentProvider都存放在android.provider。

二、实现ContentProvider的过程

1。定义ContentProvider所需要的常量(最主要的是定义CONTENT_URI,CONTENT_URI是Uri类型,事实是通过字符串解析得到)

//定义ContentProvider所需要的常量
public class FirstProviderMetaData { 

  // AUTHORIY等于自己的创建ContentProvider类的完全路径
  public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; 

  // 数据库的名称
  public static final String DATABASE_NAME = "FirstProvider.db"; 

  // BaseColumns有两个字段_id和_count
  public static final class UserTableMetaData implements BaseColumns {
    // 表名
    public static final String TABLE_NAME = "t_user";
    // 访问该ContentProvider的URI
    public static final Uri CONTENT_URI = Uri
        .parse("content://" + AUTHORIY); 

    // 表的数据类型
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users";
    // 一列的数据类型
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; 

    // 一个字段
    public static final String USER_NAME = "name"; 

    // 默认排序
    public static final String DEFAULT_SORT_ORDER = "_id desc";
  }
}

2。定义一个类,继承ContentProvider

3。实现query,insert,update,delete,getType和onCreate方法

(1).定义UriMatcher

// 匹配Uri,检查Uri的合法性
  public static final UriMatcher uriMatcher;
  public static final int INCOMING_USER_COLLECTION = 1;
  public static final int INCOMING_USER_SIGNLE = 2;
  static {
    // 创建一个uri树的根结点
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    // 添加uri匹配对,如果这个匹配成功,则code值则会返回。
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user",
        INCOMING_USER_COLLECTION);
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#",
        INCOMING_USER_SIGNLE); 

  }

(2).重写getType方法

// 根据传入uri,所回该uri所表示的数据类型
  @Override
  public String getType(Uri uri) {
    // TODO Auto-generated method stub
    switch (uriMatcher.match(uri)) {
    case INCOMING_USER_COLLECTION:
      return UserTableMetaData.CONTENT_TYPE;
    case INCOMING_USER_SIGNLE:
      return UserTableMetaData.CONTENT_ITEM_TYPE;
    default:
      throw new IllegalArgumentException("Unknown URI" + uri);
    } 

  }

(3).创建userProjectMap哈希Map静态对象

public static HashMap<String, String> userProjectMap;
  static {
    userProjectMap = new HashMap<String, String>();
    userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
    userProjectMap.put(UserTableMetaData.USER_NAME,
        UserTableMetaData.USER_NAME);
  }

(4).重写insert方法

// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    // rowId是新插入数据的id
    long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
    // 正常插入,-1为出常错误
    if (rowId != -1) {
      // 添加一个id到这个路径的结尾
      Uri insertUserUri = ContentUris.withAppendedId(
          UserTableMetaData.CONTENT_URI, rowId);
      // 得到一个ContentResolver实例.
      ContentResolver cr = this.getContext().getContentResolver();
      // 通辞呈数据改变
      cr.notifyChange(insertUserUri, null); 

      return insertUserUri;
    } else {
      throw new SQLException("Failed to insert row into" + uri);
    }
  }

(5).重写query方法

@Override
  public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
    // TODO Auto-generated method stub
    SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
    switch (uriMatcher.match(uri)) {
    case INCOMING_USER_COLLECTION:
      sqb.setTables(UserTableMetaData.TABLE_NAME);
      sqb.setProjectionMap(userProjectMap);
      break;
    case INCOMING_USER_SIGNLE:
      sqb.setTables(UserTableMetaData.TABLE_NAME);
      sqb.setProjectionMap(userProjectMap); 

      String idKey = UserTableMetaData._ID;
      // 1得到path集合
      // 2取它的集合的第2个元素
      // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id,
      // content://为协议
      // com.example.firstconent.FirstContentProvider为authoriy
      // /t_user/id为path
      String idValue = uri.getPathSegments().get(1); 

      sqb.appendWhere(idKey + "=" + idValue);
      break;
    }
    String orderBy = null;
    if (TextUtils.isEmpty(sortOrder)) {
      orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
    } else {
      orderBy = sortOrder;
    }
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Cursor cursor = sqb.query(db, projection, selection, selectionArgs,
        null, null, orderBy);
    ContentResolver cr = this.getContext().getContentResolver();
    // 通适数据变动
    cursor.setNotificationUri(cr, uri);
    return cursor;
  }

4。在AndroidManifest.xml中声明

<provider
      android:name="com.example.firstcontent.FirstContentProvider"
      android:authorities="com.example.first.firstcontent.FirstContentProvider" >
    </provider>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

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

    本文实例讲述了Android编程使用内容提供者方式进行存储的方法.分享给大家供大家参考,具体如下: 内容提供者(ContentProvider)主要作用是对外共享数据,如果数据通过内容提供者对外共享了,那么其他应用就可以从内容提供者中查询到数据,并且可更新数据.删除数据.添加数据,如果采用文件的操作模式对外共享数据,数据的访问方式会因为存储方式的不同导致数据的访问方式无法得到统一,不同存储方式文件对外进行共享其访问的ApI是不一样的,如果采用内容提供者对外共享数据就会统一了数据的访问方式.采用统

  • 基于Android 监听ContentProvider 中数据变化的相关介绍

    如果ContentProvider的访问者需要知道ContentProvider中的数据的变化情况,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri,null)来通知注册在此URI上的访问者. 复制代码 代码如下: public class PersonContentProvider extends ContentProvider[ public Uri insert(Uri uri,ContentValues va

  • 基于Android ContentProvider的总结详解

    1.适用场景1) ContentProvider为存储和读取数据提供了统一的接口2) 使用ContentProvider,应用程序可以实现数据共享3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)2.相关概念介绍1)ContentProvider简介当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的

  • 实例讲解Android中ContentProvider组件的使用方法

    ContentProvider基本使用 为了在应用程序之间交换数据,android提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentPRovider来实现,其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据. 实现ContentProvider的步骤: 1)编写一个类,继承ContentProvid

  • 深入Understanding Android ContentProvider详解

    1. 什么是ContentProvider也即内容提供者,是对所有数据访问的一层抽象,为数据访问提供了统一的接口.它有以下优点:a. 对数据的抽象,为所有的组件提供统一的访问数据的方式,从而让组件不必关心具体数据的呈现形式(文件or数据库).数据,也可以只关心自身的管理,而不用去管使用者的访问问题.这样就达到了很好的封装.b. 接口更加方便,更加方便的让组件之间传送数据ContentProvider的访问标识为Uri,通过统一的ContentResolver进行访问,而ContentResolv

  • Android开发之ContentProvider的使用详解

    前言         Content Provider为存储数据和获取数据提供了统一的接口,它可以完成在不同应用程序下的数据共享,而在上一篇文章Android开发之SQLite的使用方法讲到的SQLite只能在同一个程序中共享数据.另外android为一些常见的数据,比如说音频,视频,图片,通讯录等提供了Content Provider,这样我们就可以很方便的对这些类型的数据操作了.使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用Conten

  • Android中自定义ContentProvider实例

    //以下为TestBaidu MainActivity如下: 复制代码 代码如下: package cn.testbaidu; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import an

  • Android内容提供者ContentProvider用法实例分析

    本文实例讲述了Android内容提供者ContentProvider用法.分享给大家供大家参考,具体如下: PersonContentProvider内容提供者类 package com.ljq.db; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher;

  • Android应用中使用ContentProvider扫描本地图片并显示

    之前群里面有朋友问我,有没有关于本地图片选择的Demo,类似微信的效果,他说网上没有这方面的Demo,问我能不能写一篇关于这个效果的Demo,于是我研究了下微信的本地图片选择的Demo,自己仿照的写了下分享给大家,希望对以后有这样子需求的朋友有一点帮助吧,主要使用的是ContentProvider扫描手机中的图片,并用GridView将图片显示出来,关于GridView和ListView显示图片的问题,一直是一个很头疼的问题,因为我们手机的内存有限,手机给每个应用程序分配的内存也有限,所以图片多

  • Android ContentProvider的实现及简单实例代码

    一.概念及说明 ContentProvider定义: 内容提供者是一个Android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了ContentProvider(视频.音频),ContentProvider使用表的形式来组织数据. URI定义: 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个Cont

  • Android自定义水波纹动画Layout实例代码

    话不多说,我们先来看看效果: Hi前辈搜索预览 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果: http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及search时的loading,使用很简单,如果你也需要这样的搜索控件不妨来试试:https://github.com/onlynight/LSearchView RippleEverywh

  • Android自定义view实现太极效果实例代码

    Android自定义view实现太极效果实例代码 之前一直想要个加载的loading.却不知道用什么好,然后就想到了太极图标,最后效果是有了,不过感觉用来做loading简直丑到爆!!! 实现效果很简单,我们不要用什么贝塞尔曲线啥的,因为太极无非就是圆圆圆,只要画圆就ok了.来上代码: 因为有黑有白,所以定义2个画笔分别为黑和白. private void inital() { whitePaint = new Paint(); whitePaint.setAntiAlias(true); wh

  • Android Kotlin的使用及简单实例

    Android Kotlin的使用及简单实例 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望.为了趁热打铁,我决定提前三天放出原定本周日Release的文章.希望能及时让大家了解一下Kotlin. 相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系.因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享. 在写这篇文章前的一个多月,Flipboard中国的Andr

  • Android 录音与播放功能的简单实例

     Android 录音与播放功能的简单实例 最近在研究Android中一些常用的功能,像地图.拍照.录音和播放的实现等等,还有一些侧滑.动画等是如何实现的. 今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部的类即可实现. 1.先看下运行后的界面: 以下三张图分别是进入.录音.播放时的. 2.Layout布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

  • Android管理与操作Wifi简单实例源码

    因为需要一直在弄网络的问题,今天看了一下Wifi的操作,经过整理,做出来了一个类,可能不全,但是个人感觉已经完全能够满足需要了,当然,里面的方法也有可能是错误的或者是不全的,这个类我没有进行完整的测试,只测试了其中的一些方法. 其实操作Wifi也是很简单的,主要使用以下几个对象或变量: private WifiManager wifiManager;// 声明管理对象OpenWifi private WifiInfo wifiInfo;// Wifi信息 private List<ScanRes

  • Android连接指定Wifi的方法实例代码

    本篇文章主要记录一下Android中打开Wifi.获取Wifi接入点信息及连接指接入点的方法. 自己写的demo主要用于测试接口的基本功能,因此界面及底层逻辑比较粗糙. demo的整体界面如下所示: 上图中的OPEN按键负责开启Wifi: GET按键负责获取扫描到的接入点信息. 当获取到接入点信息后,我选取了其中的名称及信号强度,以列表的形式显示在主界面下方,如下图: 当点击列表中的Item时,就会去连接对应的接入点. 自己的逻辑比较简单,测试时的代码,假定连接的是不许要密码或密码已知的接入点.

  • Android实现沉浸式导航栏实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: private SystemBarTintManager tintManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // getWindow().addFlags(WindowManager.Layo

  • Android实现客户端语音动弹界面实例代码

    今天为大家介绍一下语音动弹界面的实现,新版本的客户端大家应该都看过了,这里我就只简单的介绍一下控件布局了.你可以在这里看到本控件的完整源码:http://git.oschina.net/oschina/android-app/blob/master/osc-android-app/src/net/oschina/app/widget/RecordButton.java 首先,整体界面分三部分,最上层自定义ActionBar相信不需要我讲大家就能看出来了. 中间部分是文字动弹部分,主体就是一个设置

  • Android开发listview选中高亮简单实现代码分享

    百度了好几种listview选中高亮的办法都太繁琐太不友好,我在无意中发现了一种简单有效的办法,而且代码量极少 源码如下: MainActivity.java package com.listviewtest; import android.os.Bundle; import android.app.Activity; import android.graphics.drawable.Drawable; import android.view.View; import android.widge

随机推荐