`
feng_home
  • 浏览: 34987 次
  • 性别: 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两个程序共享数据实例demo

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

    Android基础 Content Provider

    1、什么是内容提供者 2、怎样创建内容提供者 3、通过内容提供者完成CRUD操作 4、访问内容提供者 5、监听内容提供者数据变化 6、两个案例:监听短信以及操作联系人 最最重要的是包含了源码

    DroidProvider:(已弃用)简单的库,可帮助您使用Pojos上的注释从您的Class文件创建Android Content Provider

    简单的库,可帮助您使用注释从您的Class文件创建Android Content Provider。 如何添加到您的项目 Gradle: dependencies { compile ' mbanje.kurt:droidprovider:1.2.1 ' } 用法 检查演示应用程序。

    ContentProvider

    <provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ...

    Android开发案例驱动教程 配套代码

    11.6.2 在不同的应用中调用Content Provider 277 11.6.3 重构Content Provider调用 278 本章小结 281 第12章 多媒体 282 12.1 多媒体文件介绍 282 12.1.1 音频多媒体文件介绍 282 12.1.2 视频多媒体文件介绍 ...

    AppUpdate-一个简单、轻量、可随意定制 的Android版本更新库 .zip

     android:name="android.support.v4.content.FileProvider"  android:authorities="${applicationId}"  android:exported="false"  android:grantUriPermissions="true">  <meta-data  android:name=...

    RealmTodo:使用RealmDB和Android Content Provider的Todo App实施

    RealmTodo 具有RealmDB的Android内容提供程序 RealmDB是一个有趣的快速noSQL数据库。 它可以轻松地与Android本机组件集成。 您唯一需要做的就是重写CP CRUD方法。 作为对的挑战而创建

    Android应用开发详解

    Content Provider,讲述了Android不同应用程序之间相互共享数据的机制,包括ContentProvider和ContentResolver 第11章 Android中的多媒体应用 Android中的多媒体应用,讲述了Android的图片应用、音频及视频播放、...

    ContentProviderCodeGenerator, 创建Android内容源的代码生成器.zip

    ContentProviderCodeGenerator, 创建Android内容源的代码生成器 DatabaseCodeGenerator这个项目是用Java编写的代码生成器,用于生成Android代码。 如果给定了数据库模式JSON定义文件,那么将生成在项目中添加相应...

    《Android系统源代码情景分析》

    10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 ...

    android初学者入门教程ppt

    android初学者入门教程 ppt Android系统简介 建立Android开发环境 第一个Android应用 Android程序基础 Intent与Activity Activity生命周期 使用Service Content Provider

    ContentProvider的创建与访问 android

    ContentProvider的创建与访问 android

    《Android视频教程》概述 Android视频教程简介

    普及android开发知识,全教程分八部分: ...第二讲建立Android开发环境 第三讲第一个Android应用 第四讲Android程序基础 第五讲Intent与Activity 第六讲Activity生命周期 第七讲使用Service 第八讲Content Provider

    Android系统源代码情景分析-罗升阳-源码

    10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 System进程...

    老罗android开发视频教程全集百度网盘下载

    Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 相关资源访问/资源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 4高级编程(第3版)源代码

    第8章 数据库和Content Provider 第9章 在后台操作 第10章 扩展用户体验 第11章 高级用户体验 第12章 硬件传感器 第13章 地图、地理编码和基于位置的服务 第14章 个性化主屏幕 第15章 音频、视频以及摄像头的使用

    Android SDK开发范例大全 PPT

    该PPT全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计功力提供了...建立Android开发环境 第一个Android应用 Android程序基础 Intent与Activity Activity生命周期 使用Service Content Provider

    Android开发与应用——张荣,原书配套课件

    6.5.1 使用Content Provider发布数据 6.5.2 使用Content Resolver获取数据 6.6 小结 练习 第7章 多线程及消息处理 7.1 Android多线程概述 7.1.1 创建线程 7.1.2 操作线程 7.2 UI线程与非UI线程 7.3...

    Android帮助文档

    Android帮助文档(第一部分)新手上路 ...Content Provider 20 4、入门指引 20 入门指引:记事本应用 21 记事本练习 1 22 记事本练习 2 29 记事本练习 3 38 入门指引: 额外的练习(Extra Credit) 43

Global site tag (gtag.js) - Google Analytics