Android的ContentProvider之二 实现自己的ContentProvider

本文介绍了如何创建Android的ContentProvider子类,并详细讲解了实现query(), insert(), update()和delete()方法。同时,文章阐述了在AndroidManifest.xml中注册ContentProvider,设置android:authorities属性的重要性。此外,还探讨了UriMatcher的使用,包括addURI()方法用于注册Uri,match()方法用于查找匹配的标识码,以及如何通过withAppendedId()和parseId()处理Uri中的ID信息。最后,提到了ContactsContract中的常见Content_URI。" 102789841,8028537,HTTP协议详解:从入门到精通(上),"['HTTP协议', '网络通信', 'TCP/IP', 'URI/URL', 'HTTPS']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发只需两步:
  1. 开发一个ContentProvider的子类,该子类需要实现query()、insert()、update()和delete()
  2. 在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性
<provider
           
android:name=".FirstProvider"
           
android:authorities="com.example.providers.firstprovider"
           
android:exported="true"
            />
示例代码:
first_provider
public class FirstProvider extends ContentProvider
{
// 第一次创建该ContentProvider时调用该方法
@Override
public boolean onCreate()
{
System.
out.println("===onCreate方法被调用===");
return true;
}

// 该方法的返回值代表了该ContentProvider所提供数据的MIME类型
@Override
public String getType(Uri uri)
{
System.
out.println("~~getType方法被调用~~");
return null;
}

// 实现查询方法,该方法应该返回查询得到的Cursor
@Override
public Cursor query(Uri uri, String[] projection, String where,
String[] whereArgs, String sortOrder)
{
System.
out.println(uri + "===query方法被调用===");
System.
out.println("where参数为:" + where);
return null;
}

// 实现插入的方法,该方法应该新插入的记录的Uri
@Override
public Uri insert(Uri uri, ContentValues values)
{
System.
out.println(uri + "===insert方法被调用===");
System.
out.println("values参数为:" + values);
return null;
}

// 实现删除方法,该方法应该返回被删除的记录条数
@Override
public int delete(Uri uri, String where, String[] whereArgs)
{
System.
out.println(uri + "===delete方法被调用===");
System.
out.println("where参数为:" + where);
return 0;
}

// 实现删除方法,该方法应该返回被更新的记录条数
@Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs)
{
System.
out.println(uri + "===update方法被调用===");
System.
out.println("where参数为:"
+ where +
",values参数为:" + values);
return 0;
}
}
FirstResolver.java
public class FirstResolver extends ActionBarActivity {


ContentResolver
contentResolver;
Uri
uri = Uri.parse("content://com.example.providers.firstprovider/");

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView(R.layout.
main);
       
contentResolver = getContentResolver();
    }
   
public void query(View source)
    {
    Cursor c =
contentResolver.query(
   
uri, null, "query_where", null, null);
    Toast.makeText(
this, "CP return Cursor :" + c
    , Toast.
LENGTH_SHORT).show();
    }
   
public void insert(View source)
    {
    ContentValues values =
new ContentValues();
    values.put(
"name","fkjava");
    Uri newUri =
contentResolver.insert(uri, values);
    Toast.makeText(
this, "CP insert Uri :" + newUri
    , Toast.
LENGTH_SHORT).show();
    }
   
public void update(View source)
    {
    ContentValues values =
new ContentValues();
    values.put(
"name","fkjava");
   
int count = contentResolver.update(uri, values
    ,
"update_where",null);
    Toast.makeText(
this, "CP update log :" + count
    , Toast.
LENGTH_SHORT).show();
    }
   
public void delete(View source)
    {
   
int count = contentResolver.delete(uri
    ,
"delete_where",null);
    Toast.makeText(
this, "CP delte log :" + count
    , Toast.
LENGTH_SHORT).show();
    }
}


android提供了UriMatcher工具类
  • void addURI(String authority, String path, int code):该方法用于向UriMatcher对象注册Uri;(authority与path组合成一个Uri,code则代表Uri对应的标识码)
  • int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码。如果找不到标识码则返回-1
android还提供了ContentUris工具类
  • withAppendedId(uri, id)用于为路径加上ID部分
  • parseId(uri):用于从指定Uri中解析出包含的ID值
常常提供工具类,方便维护(在类中定义常用字符串常量)
示例代码如下:
public class DictProvider extends ContentProvider {
     private static UriMathcer matcher = new UriMatcher(UriMaather.NO_MATCH);
     private static final int WORDS = 1;
     private static final int WORD = 2;
     private MyDatabaseHelper dbOpenHelper;
     static {
          matcher.addURI(Words.AUTHORITY, "words", WORDS);
          matcher.addURI(Words.AUTHORITY, "word/#", WORD);
     }

     @Override
     public boolean OnCreate() {
          dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1);
          return true;
     }

     @Override
     public String getType(Uri uri) {
          switch (matcher.match(uri)) {
          case WORDS:
               return "vnd.android.cursor.dir/com.example.dict";
          case WORD:
               return "vnd.android.cursor.item/com.example.dict";
          default:
               throw new IllegalArgumentException("unknown Uri:" + uri);
          }
     }

     @Override
     public Cursor query(Uri uri, String[] projection, String where,
               String[] whereArgs, String sortOrder) {
          SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
          switch (matcher.match(uri)) {
          case WORDS:
               return db.query("dict", projection, where, whereArgs, null, null,
                         sortOrder);
          case WORD:
               long id = ContentUris.parseId(uri);
               String whereClause = Words.Word._ID + "=" + id;
               if (where != null && !"".equals(where)) {
                    whereClause = whereClause + " and " + where;
               }
               return db.query("dict", projection, whereClause, whereArgs, null,
                         null, sortOrder);
          default:
               throw new IllegalArgumentException("unknown Uri:" + uri);
          }
     }

     @Override
     public Uri insert(Uri uri, ContentValues values) {
          SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
          switch (matcher.match(uri)) {
          case WORDS:
               long rowId = db.insert("dict", Words.WORD._ID, values);
               if (rowId > 0) {
                    Uri wordUri = ContentUris.withAppendedId(uri, rowId);
                    getContext().getContentResolver().notifyChange(wordUri, null);
                    return wordUri;
               }
               break;
          default:
               throw new IllegalArgumentException("unknown Uri:" + uri);
          }
     }

     @Override
     public int update(Uri uri, ContentValues values, String where,
               String[] whereArgs) {
          SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
          int num = 0;
          switch (matcher.match(uri)) {
          case WORDS:
               num = db.update("dict", values, where, whereArgs);
               break;
          case WORD:
               long id = ContentUris.parseId(uri);
               String whereClause = Words.Word._ID + "=" + id;
               if (where != null && !"".equals(where)) {
                    whereClause = whereClause + " and " + where;
               }
               num = db.update("dict", values, whereClause, whereArgs);
               break;
          default:
               throw new IllegalArgumentException("unknown Uri:" + uri);
               return num;
          }
     }

     @Override
     public int update(Uri uri, ContentValues values, String where,
               String[] whereArgs) {
          SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
          int num = 0;
          switch (matcher.match(uri)) {
          case WORDS:
               num = db.delete("dict", values, where, whereArgs);
               break;
          case WORD:
               long id = ContentUris.parseId(uri);
               String whereClause = Words.Word._ID + "=" + id;
               if (where != null && !"".equals(where)) {
                    whereClause = whereClause + " and " + where;
               }
               num = db.delete("dict", values, whereClause, whereArgs);
               break;
          default:
               throw new IllegalArgumentException("unknown Uri:" + uri);
          }
          getContext().getContentResolver().notifyChange(uri, null);               return num;
          return num;
     }
}


系统CP
android对联系人管理ContentProvider的几个Uri如下
  • ContactsContract.Contacts.CONTENT_URI
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI
  • ContactsContract.CommonDataKinds.Email.CONTENT_URI
Android为多媒体提供的ContentProvider的Uri如下:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

MediaStore.Audio.Media.INTERNAL_CONTENT_URI

MediaStore.Images.Media.EXTERNAL_CONTENT_URI

MediaStore.Images.Media.INTERNAL_CONTENT_URI

MediaStore.Video.Media.EXTERNAL_CONTENT_URI

MediaStore.Video.Media.INTERNAL_CONTENT_URI

Android图片浏览器并不需要程序员去遍历SD卡的图片文件,直接查询系统多媒体ContentProvider即可获取系统中所有的图片信息
package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tigongzhe" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tigongzhe.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ></provider> </application> <permission android:name="com.example.tigongzhe.permission" android:protectionLevel="normal"></permission> </manifest> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值