`

Content Provider

 
阅读更多
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.
其中建立匹配树,需要调用UriMatcher的addURI方法:
static{
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
      uriMatcher.addURI(PROVIDER_NAME, "books", BOOKS);
      uriMatcher.addURI(PROVIDER_NAME, "books/#", BOOK_ID);
   }

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** 在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、...

    Content Provider获取联系人和图片

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。本篇文章将深入探讨如何利用Content Provider获取联系人和图片,以及相关的知识点。 ...

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

    在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解...

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

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

    Android新手Content Provider获取通讯录,短信,通话记录

    理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。

    四大组件 Activity Service content provider broadcast receiver

    ### 四大组件详解:Activity、Service、Content Provider与Broadcast Receiver #### 一、Activity **定义:** Activity是Android应用程序中的四大基本组件之一,它代表一个屏幕界面,用户可以直接与其进行交互。每...

    编写content provider

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。这篇博客“编写Content Provider”很可能是深入解析如何创建和使用自定义Content ...

    content provider.doc

    Content Provider是Android系统中一种核心组件,用于在不同应用程序之间共享数据。它是Android四大组件(Activity、Service、BroadcastReceiver和Content Provider)之一,允许开发者安全地暴露应用数据,供其他应用...

    Content Provider的使用

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地交换数据。这篇博客“Content Provider的使用”深入探讨了如何在Android开发中利用Content Provider实现...

    content_provider_demo

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

    android中Content Provider

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

    content provider 和sqllite用法整理

    在Android开发中,Content Provider和SQLite数据库是两个非常重要的组件,它们主要用于数据的存储和共享。下面将详细讲解这两个概念及其用法。 首先,我们来理解Content Provider。Content Provider是Android系统...

    Android Content Provider Demo

    在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本"Android Content Provider Demo"着重于演示如何创建和使用Content Provider来实现跨...

    使用Content Provider案例

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本案例将深入探讨如何创建和使用Content Provider,以实现跨应用的数据交换。 首先,...

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

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。这篇博客“简单实现自己的Content Provider(一)”旨在引导开发者如何从零开始构建一...

    android 自定义 Content Provider示例

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

    Android内容提供者(Content provider)

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

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

    本文将详细解析2011年9月7日关于Android跨进程通信之Content Provider的知识点,结合相关源码和实用工具进行阐述。 Content Provider是Android四大组件之一,它扮演着数据管理者的角色,允许不同的应用程序之间共享...

Global site tag (gtag.js) - Google Analytics