`
feng_home
  • 浏览: 35574 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

创建自己的Android content provider

阅读更多

以前的一篇博客中,曾将介绍了如何使用content provider, 如果需要创建你自己的cotent provider,也就是定制自己特有的,你需要做的其实很简单,那就是从抽象类ContentProvider派生出你自己的类,并且实现里面所有的抽象方法,包括:

在你的content provider里面,你有随意选择存储媒介的权利,你可以用传统文件,xml,甚至是一些特定的web service, 当然你也可以选择用的最为广泛的SQLite

 

在你自己的类中,你需要定义一个public static final Uri 命名为CONTENT_URI

 

具体方法,还是通过一个例子来说明吧

public class BooksProvider extends ContentProvider

{
   public static final String PROVIDER_NAME =
      "MyContentProvider";  

   public static final Uri CONTENT_URI =
      Uri.parse("content://"+ PROVIDER_NAME + "/books");  

   public static final String _ID = "_id";
   public static final String TITLE = "title";
   public static final String ISBN = "isbn";
   private static final int BOOKS = 1;
   private static final int BOOK_ID = 2;     
   private static final UriMatcher uriMatcher;

   static{
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
      uriMatcher.addURI(PROVIDER_NAME, "books", BOOKS);
      uriMatcher.addURI(PROVIDER_NAME, "books/#", BOOK_ID);
   } 

  

   //---for database use---
   private SQLiteDatabase booksDB;
   private static final String DATABASE_NAME = "Books";
   private static final String DATABASE_TABLE = "titles";
   private static final int DATABASE_VERSION = 1;
   private static final String DATABASE_CREATE =
         "create table " + DATABASE_TABLE +
         " (_id integer primary key autoincrement, "
         + "title text not null, isbn text not null);";  

   @Override
   public boolean onCreate() {
      Context context = getContext();
      DatabaseHelper dbHelper = new DatabaseHelper(context);
      booksDB = dbHelper.getWritableDatabase();
      return (booksDB == null)? false:true;
   }
  
   private static class DatabaseHelper extends SQLiteOpenHelper
   {
      DatabaseHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
      }

 
      @Override
      public void onCreate(SQLiteDatabase db)
      {
         db.execSQL(DATABASE_CREATE);
      }
  
      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion,
      int newVersion) {
         Log.w("Content provider database",
              "Upgrading database from version " +
              oldVersion + " to " + newVersion +
              ", which will destroy all old data");
         db.execSQL("DROP TABLE IF EXISTS titles");
         onCreate(db);
      }
   } 
  
   @Override
   public String getType(Uri uri) {
      switch (uriMatcher.match(uri)){
         //---get all books---
         case BOOKS:
            return "vnd.android.cursor.dir/vnd.learn2develop.books ";
         //---get a particular book---
         case BOOK_ID:
            return "vnd.android.cursor.item/vnd.learn2develop.books ";
         default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
      }
   }

   @Override
   public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {    

      SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
      sqlBuilder.setTables(DATABASE_TABLE);    

      if (uriMatcher.match(uri) == BOOK_ID)
         //---if getting a particular book---
         sqlBuilder.appendWhere(
            _ID + " = " + uri.getPathSegments().get(1));       

      if (sortOrder==null || sortOrder=="")
         sortOrder = TITLE;

         Cursor c = sqlBuilder.query(
         booksDB,
         projection,
         selection,
         selectionArgs,
         null,
         null,
         sortOrder);

      //---register to watch a content URI for changes---
      c.setNotificationUri(getContext().getContentResolver(), uri);
      return c;
   }
  
   @Override
   public Uri insert(Uri uri, ContentValues values) {
      //---add a new book---
      long rowID = booksDB.insert(
         DATABASE_TABLE, "", values);           

      //---if added successfully---
      if (rowID>0)
      {
         Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
         getContext().getContentResolver().notifyChange(_uri,null); 
         return _uri;
      }

      throw new SQLException("Failed to insert row into " + uri);
   }
  
   @Override
   public int delete(Uri arg0, String arg1, String[] arg2) {
      // arg0 = uri 
      // arg1 = selection
      // arg2 = selectionArgs

      int count=0;
      switch (uriMatcher.match(arg0)){
         case BOOKS:
            count = booksDB.delete(
               DATABASE_TABLE,
               arg1,
               arg2);

            break;

         case BOOK_ID:
            String id = arg0.getPathSegments().get(1);
            count = booksDB.delete(
               DATABASE_TABLE,
               _ID + " = " + id +
               (!TextUtils.isEmpty(arg1) ? " AND (" +
               arg1 + ')' : ""),
               arg2);
            break;

         default: throw new IllegalArgumentException(
            "Unknown URI " + arg0); 

      } 

      getContext().getContentResolver().notifyChange(arg0, null);

      return count; 

   }

 

   @Override

   public int update(Uri uri, ContentValues values, 

      String selection, String[] selectionArgs) 

   {

      int count = 0;

      switch (uriMatcher.match(uri)){

         case BOOKS:

            count = booksDB.update(

               DATABASE_TABLE, 

               values,

               selection, 

               selectionArgs);

            break;

         case BOOK_ID: 

            count = booksDB.update(

               DATABASE_TABLE, 

               values,

               _ID + " = " + uri.getPathSegments().get(1) + 

               (!TextUtils.isEmpty(selection) ? " AND (" + 

                  selection + ')' : ""), 

                selectionArgs);

            break;

         default: throw new IllegalArgumentException(

            "Unknown URI " + uri); 

      } 

      getContext().getContentResolver().notifyChange(uri, null);

      return count;

   }
}

 

需要强调一点的是,如果想要建立一个自己的content provider,需要自己建立起一个UriMatcher objects 树。其中UriMatcher是一个android自带的类,用来辅助匹配当前content provider中的URI.

其中建立匹配树,需要调用UriMatcheraddURI方法:

static{
      uriMatcher
= new UriMatcher(UriMatcher.NO_MATCH);
      uriMatcher
.addURI(PROVIDER_NAME, "books", BOOKS);
      uriMatcher
.addURI(PROVIDER_NAME, "books/#", BOOK_ID);
   
}

 

当需要匹配时,需要调用uriMatcher.match方法。例如:

public String getType(Uri uri) {
      switch (uriMatcher.match(uri)){
         //---get all books---

         case BOOKS:
            return "vnd.android.cursor.dir/vnd.learn2develop.books ";
         //---get a particular book---
         case BOOK_ID:
            return "vnd.android.cursor.item/vnd.learn2develop.books ";
         default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
      }
   }

 

分享到:
评论

相关推荐

    android content provider示例程序(简单记账)

    在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的...通过学习和实践,开发者可以创建更复杂的Content Provider,支持更多类型的数据和更丰富的操作,从而在Android平台上实现更高效的数据共享。

    Android Content Provider Demo

    Content Provider是Android系统提供的一种机制,允许应用程序暴露自己的数据给其他应用,或者获取其他应用公开的数据。它遵循严格的读写权限控制,确保数据的安全性。在这个Demo中,我们将学习如何创建一个基本的...

    Android基础 Content Provider

    内容提供者(Content Provider)是Android系统中的一种机制,允许应用程序将自己的数据暴露给其他应用。它是一个实现了标准接口的组件,用于存储和检索数据,使得不同应用之间可以安全地共享数据,即使这些数据存储...

    android中Content Provider

    在Android系统中,Content Provider是四大组件之一,它是应用程序间数据共享的核心机制。Content Provider允许一个应用暴露其数据,使得其他应用可以读取或者写入这些数据,甚至跨应用程序进行数据交换。这篇博客...

    android 自定义 Content Provider示例

    在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...

    android provider

    Content Provider使得应用程序可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个"android provider"主题中,我们将深入探讨Content Provider的工作原理、实现方式以及如何在实际应用中使用...

    content_provider_demo

    在Android开发中,Content Provider是一种重要的组件,它允许应用程序之间共享数据。`content_provider_demo`是一个展示如何创建和使用Content Provider的示例项目。在这个项目中,开发者将学习如何为其他应用提供...

    Content Provider获取联系人和图片

    如果你需要共享自定义的数据,可以创建自己的Content Provider。这需要实现ContentProvider类,并覆盖onCreate()、query()、insert()、update()、delete()等方法。 在上述代码示例中,CPTest可能是一个测试应用或...

    android content provider两个程序共享数据实例demo

    android content provider两个程序共享数据实例demo。简单的两个应用app之间共享数据。 getContentResolver().insert() getContentResolver().query() getContentResolver().delete() getContentResolver().update()

    编写content provider

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,...通过阅读这篇博客,开发者可以深入了解Content Provider的工作原理,以及如何编写自己的Content Provider,从而提升Android开发技能。

    content provider实现数据共享demo(内有两个项目)

    在Android应用开发中,Content Provider是一种重要的组件,它允许应用程序之间进行数据共享。Content Provider作为Android系统中的数据接口,能够使一个应用的数据被其他应用访问和操作,这在多应用协同工作或者数据...

    简单实现自己的Content Provider(一)

    这篇博客“简单实现自己的Content Provider(一)”旨在引导开发者如何从零开始构建一个基本的Content Provider。 首先,我们需要理解Content Provider的基本结构。Content Provider由一系列类组成,其中最重要的是...

    2011.09.07(4)——— android 跨进程通信之content provider

    首先,创建Content Provider需要定义一个继承自`android.content.ContentProvider`的类。在这个类中,我们需要重写以下几个关键方法: 1. `onCreate()`: 当Content Provider被系统加载时调用,用于进行初始化操作。...

    Content Provider的使用

    首先,我们需要创建一个Content Provider类,它是抽象类`android.content.ContentProvider`的子类。在这个类中,我们需要重写以下几个关键方法: 1. `onCreate()`: 当Content Provider被系统加载时调用,用于初始化...

    Android内容提供者(Content provider)

    **Android内容提供者(Content Provider)详解** 在Android系统中,数据共享是应用程序间交互的重要方式,而Android内容提供者(Content Provider)正是实现这一功能的关键组件。Content Provider作为Android四大...

    Android中使用Content Provider组件访问通讯录中的联系人和添加联系人案例详解

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地共享数据。本文将深入探讨如何使用Content Provider组件来访问和操作Android设备上的通讯录,特别是针对...

    Android学习之通过content provider获得联系人

    在Android系统中,Content Provider是一种核心组件,它负责在应用程序之间共享数据。这篇博客"Android学习之通过content provider获得联系人"将引导我们深入理解如何使用Content Provider来访问和操作设备上的联系人...

    使用Content Provider案例

    通过这个案例,你可以学习到如何创建自己的Content Provider,实现跨应用数据共享,这对于开发需要多个应用之间交换数据的Android项目至关重要。同时,掌握Content Provider的使用也能加深对Android系统架构的理解,...

    Android应用程序组件Content Provider的共享数据更新通知机制分析.doc

    应用程序在需要监听Content Provider数据变化时,会创建一个ContentObserver的实例并注册到ContentResolver。注册过程中,应用程序提供一个回调方法,当数据发生变化时,此方法会被触发。ContentResolver通过Binder...

    content provider.doc

    创建自定义Content Provider需要继承`android.content.ContentProvider`类,并实现其抽象方法。开发者需要在`onCreate()`方法中初始化数据库,然后重写`query()`, `insert()`, `update()`, `delete()`和`getType()`...

Global site tag (gtag.js) - Google Analytics