iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android中ContentProvider和ContentResolver详解
  • 759
分享到

Android中ContentProvider和ContentResolver详解

Android 2022-06-06 01:06:42 759人浏览 薄情痞子
摘要

Android中ContentProvider和ContentResolver详解 在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法: 1)aiD

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;

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
  }
  
  @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;
  }
  
  @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;
    }
  }
  
  @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;
  }
  
  @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;
  }
  
  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;
  }
  
  @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));
        }

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

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

您可能感兴趣的文章:Android 中自定义ContentProvider与ContentObserver的使用简单实例Android 中ContentProvider的实例详解Android ContentProvider实现获取手机联系人功能Android数据持久化之ContentProvider机制详解Android开发教程之ContentProvider数据存储android基础总结篇之八:创建及调用自己的ContentProviderAndroid学习笔记之ContentProvider和Uri详解实例解析Android系统中的ContentProvider组件用法Android7.0中关于ContentProvider组件详解


--结束END--

本文标题: Android中ContentProvider和ContentResolver详解

本文链接: https://www.lsjlt.com/news/21729.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作