Android中ContentProvider和ContentResolver详解

Android中ContentProvider和ContentResolver详解

在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法:

1)AIDL 2)Broadcast 3)ContentProvider。

使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦;使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的;使用ContentProvider我们不需要接口描述,只需要知道协议,同时这种方式是同步的,使用方便。

下面是ContentProvider实现:

package com.backgroundservice;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.NET.Uri;
import android.util.Log;

/**
 * TODO
 *
 * @author zengpeng
 * @version 1.0 Create At : 2010-3-18 下午02:52:40
 */
public class TestContentProvider extends ContentProvider {
  private SQLiteDatabase mDb;
  private DatabaseHelper mDbHelper = null;
  private static final String DATABASE_NAME = "rssitems.db";
  private static final String DATABASE_TABLE_NAME = "rssItems";
  private static final int DB_VERSION = 1;
  private static final int ALL_MESSAGES = 1;
  private static final int SPECIFIC_MESSAGE = 2;

  // Set up our URL matchers to help us determine what an
  // incoming URI parameter is.
  private static final UriMatcher URI_MATCHER;
  static {
    URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    URI_MATCHER.addURI("test", "item", ALL_MESSAGES);
    URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);
  }

  // Here's the public URI used to query for RSS items.
  public static final Uri CONTENT_URI = Uri
      .parse("content://test/item");

  // Here are our column name constants, used to query for field values. 

    public static final String ID = "_id";
    public static final String NAME = "NAME";
    public static final String VALUE = "VALUE";
    public static final String DEFAULT_SORT_ORDER = ID + " DESC";

  private static class DatabaseHelper extends AbstractDatabaseHelper {

    @Override
    protected String[] createDBTables() {
      // TODO Auto-generated method stub
      String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID
          + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"
          + VALUE + " TEXT);";
      return new String[] { sql };
    }

    @Override
    protected String[] dropDBTables() {
      // TODO Auto-generated method stub
      return null;
    }

    @Override
    protected String getDatabaseName() {
      // TODO Auto-generated method stub
      return DATABASE_NAME;
    }

    @Override
    protected int getDatabaseVersion() {
      // TODO Auto-generated method stub
      return DB_VERSION;
    }

    @Override
    protected String getTag() {
      // TODO Auto-generated method stub
      return TestContentProvider.class.getSimpleName();    }

  }

  /**
   *
   */
  public TestContentProvider() {
    // TODO Auto-generated constructor stub

  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#delete(android.Net.Uri,
   * Java.lang.String, java.lang.String[])
   */
  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    // NOTE Argument checking code omitted. Check your parameters!
    int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs);

    // Notify any listeners and return the deleted row count.
    getContext().getContentResolver().notifyChange(uri, null);
    return rowCount;
  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#getType(android.net.Uri)
   */
  @Override
  public String getType(Uri uri) {
    switch (URI_MATCHER.match(uri)) {
    case ALL_MESSAGES:
      return "vnd.android.cursor.dir/rssitem"; // List of items.
    case SPECIFIC_MESSAGE:
      return "vnd.android.cursor.item/rssitem"; // Specific item.
    default:
      return null;
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#insert(android.net.Uri,
   * android.content.ContentValues)
   */
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    // NOTE Argument checking code omitted. Check your parameters! Check that
    // your row addition request succeeded!
    long rowId = -1;
    rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);
    Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);
    Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri);
    // Notify any listeners and return the URI of the new row.
    getContext().getContentResolver().notifyChange(CONTENT_URI, null);
    return newUri;
  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#onCreate()
   */
  @Override
  public boolean onCreate() {
    // TODO Auto-generated method stub
    try
    {
      mDbHelper = new DatabaseHelper();
      mDbHelper.open(getContext());
      mDb = mDbHelper.getMDb();
    }catch(Exception e){
      e.printStackTrace();
    }
    return true;
  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#query(android.net.Uri,
   * java.lang.String[], java.lang.String, java.lang.String[],
   * java.lang.String)
   */
  public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
    // We won't bother checking the validity of params here, but you should!

    // SQLiteQueryBuilder is the helper class that creates the
    // proper SQL syntax for us.
    SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();

    // Set the table we're querying.
    qBuilder.setTables(DATABASE_TABLE_NAME);

    // If the query ends in a specific record number, we're
    // being asked for a specific record, so set the   

    // WHERE clause in our query.
    if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
      qBuilder.appendWhere("_id=" + uri.getLastPathSegment());
      Log.i("TestContentProvider", "_id=" + uri.getLastPathSegment());
    }

    // Make the query.
    Cursor c = qBuilder.query(mDb,
        projection,
        selection,
        selectionArgs,
        null,
        null,
        sortOrder);
    Log.i("TestContentProvider", "get records");
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
  }

  /*
   * (non-Javadoc)
   *
   * @see android.content.ContentProvider#update(android.net.Uri,
   * android.content.ContentValues, java.lang.String, java.lang.String[])
   */
  @Override
  public int update(Uri uri, ContentValues values, String selection,
      String[] selectionArgs) {
    // NOTE Argument checking code omitted. Check your parameters!
    int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);

    // Notify any listeners and return the updated row count.
    getContext().getContentResolver().notifyChange(uri, null);
    return updateCount;
  }

}

配文件如下:

 <provider android:name="TestContentProvider"
      android:authorities="test">
    </provider>

在客户端中可以使用如下方法进行调用:

 ContentValues values = new ContentValues();
        values.put(TestContentProvider.NAME, "testname1");
        values.put(TestContentProvider.VALUE, "testvalu1e");
        Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values);
        Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{TestContentProvider.NAME}, null, null, null);
        Log.i("TestActivity", "" + c.getCount());
        if(c.moveToNext())
        {
          Log.i("TestActivity", c.getString(0));
        }

上面的代码是先进行插入,然后进行查询并打印。就是如此简单,所有的应用如果需要都可以对外方便的提供数据接口,同时其他应用也可以很方便的进行调用。

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

(0)

相关推荐

  • android利用ContentResolver访问者获取手机联系人信息

    利用ContentResolver内容访问者,获取手机联系人信息我做了两种不同的做法.第一种,直接获取所有手机联系人信息,展示在ListView中.第二种,通过Butten按钮跳转到系统的手机联系人界面,单个获取手机联系人信息,展示在ListView中,结果如下: 第一种: 第二种: 第一种:直接获取所有手机联系人信息 首先需要在AndroidManifest.xml文件中添加权限: <uses-permission android:name="android.permission.REA

  • android之ContentResolver与ContentProvider介绍

    android中对数据操作包含有: file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据. android中提供ContectResolver与ContentProvider来操作别的应用程序的数据. 一. 使用方式 一个应用实现ContentProvider来提供内容给别的应用来操作, 一个应用通过ContentResolver来操作别的应用数

  • Android ContentResolver使用说明

    Android是如何实现应用程序之间数据共享的?一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert).删除(delete).查询(query).修改(update),当然需要一定的权限才可以. 如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可

  • Android使用ContentResolver搜索手机通讯录的方法

    本文实例讲述了Android使用ContentResolver搜索手机通讯录的方法.分享给大家供大家参考,具体如下: 在这个程序中使用ContentResolver来访问通讯录里联系人的关键字,并将所有找到的联系人存入CursorAdapter里.输入搜索人员名字a ,会将所有以a开头的名字都显示出来,输入*,则所有通讯录中的人名显示于AutoCompleteView的AdapterView里,若发生了User选择事件后,会将勾选的联系人电话号码显示于TextView里. 此程序中用到了Cont

  • android ContentResolver获取手机电话号码和短信内容

    通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来,供大家参考,具体内容如下 1.实现的代码: package com.example.phone; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; impo

  • android利用ContentResolver访问者获取手机短信信息

    利用ContentResolver访问者获取手机短信信息,在此记录一下,一遍以后查询. 首先看一下结果,结果如下: activity_message.xml类: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_

  • Android中ContentProvider和ContentResolver详解

    Android中ContentProvider和ContentResolver详解 在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法: 1)AIDL 2)Broadcast 3)ContentProvider. 使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦:使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的:使用ContentProvider我们不需要接口描述,只

  • Android 中ContentProvider的实例详解

    Android 中ContentProvider的实例详解 Content Provider 的简单介绍: * Android中的Content Provider 机制可支持在多个应用中存储和读取数据.这也是跨应用 共享数据的唯一方式.在Android系统中,没有一个公共的内存区域,供多个应用共享存储数据: * Android 提供了一些主要数据类型的ContentProvider ,比如:音频.视频.图片和私人通讯录等: 在android.provider 包下面找到一些android提供的C

  • Android中SQLite 使用方法详解

    Android中SQLite 使用方法详解 现在的主流移动设备像android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面就向大家介绍一下SQLite常用的操作方法,为了方便,我将代码写在了Activity的onCreate中: @Ov

  • Android 中 ActivityLifecycleCallbacks的实例详解

    Android 中 ActivityLifecycleCallbacks的实例详解           以上就是使用ActivityLifecycleCallbacks的实例,代码注释写的很清楚大家可以参考下, MyApplication如下: package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bun

  • Android 中 onSaveInstanceState()使用方法详解

    Android 中 onSaveInstanceState()使用方法详解 覆盖onSaveInstanceState方法,并在onCreate中检测savedInstanceState和获取保存的值 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("currentposition", videoView.getCurrentPosition()); super.onSave

  • Android 中Manifest.xml文件详解

    Android 中Manifest.xml文件详解 每一个Android项目都包含一个清单(Manifest)文件--AndroidManifest.xml,它存储在项目层次中的最底层.清单可以定义应用程序及其组件的结构和元数据. 它包含了组成应用程序的每一个组件(活动.服务.内容提供器和广播接收器)的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的. 它还提供了各种属性来详细地说明应用程序的元数据(如它的图标或者主题)以及额外的可用来进行安全设置和单

  • Java中的instanceof关键字在Android中的用法实例详解

    在下面介绍Android中如何使用instanceof关键字开发更方便时,先来温习一下java中instanceof的概念. instanceof大部分的概念是这样定义的:instanceof是Java的一个二元操作符,和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据.举个栗子: String s = "I AM an Object!"; boolean isObj

  • Android 中Banner的使用详解

    首先倒入一个依赖: compile 'com.youth.banner:banner:1.4.9' 添加的权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 布局文件: <com.youth.banner.B

  • Android中图片压缩方案详解及源码下载

    Android中图片压缩方案详解及源码下载 图片的展示可以说在我们任何一个应用中都避免不了,可是大量的图片就会出现很多的问题,比如加载大图片或者多图时的OOM问题,可以移步到Android高效加载大图及多图避免程序OOM.还有一个问题就是图片的上传下载问题,往往我们都喜欢图片既清楚又占的内存小,也就是尽可能少的耗费我们的流量,这就是我今天所要讲述的问题:图片的压缩方案的详解. 1.质量压缩法 设置bitmap options属性,降低图片的质量,像素不会减少 第一个参数为需要压缩的bitmap图

  • Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Parcelable相对于Serializable的使用相对复杂一些. 2.Parcelable的效率相对Serializable也高很多. 3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性.尽管Serializable

随机推荐