参考:

http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html

http://aijiawang-126-com.iteye.com/blog/655268

http://blog.csdn.net/imyfriend/article/details/6589917

public class Book {public static final String   DATABASE_NAME="books.db";public static final String    TABLE_NAME="book";public static final int  VERSION=1;public static final String ID="_id";public static final String TITLE="title";public static final String PRICE ="price";public static final String AUTHORITY="com.android.provider.book";public static final int ITEM=1;public static final int ITEM_ID=2;public static final String CONTENT_TYPE="vnd.android.cursor.dir/vnd.com.android.book";public static final String CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.com.android.book";public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/item");
}

  

package com.android.bookgallery;import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;public class BookGallery extends Activity {private class MyrContentObserver extends ContentObserver {public MyrContentObserver() {super(new Handler());}public void onChange(final boolean selfChange) {Log.v("test", "Service ContentObserver received notification");}}MyrContentObserver mObserver;private void registMyContentObserver(){mObserver = new MyrContentObserver();  getContentResolver().registerContentObserver(Book.CONTENT_URI,  true, mObserver);  }private void unregistMyContentObserver(){getContentResolver().unregisterContentObserver(mObserver);}/** Called when the activity is first created. */EditText etTitle;EditText etPrice;Button btnAdd;Button btnDelete;ListView lvBooks;ContentResolver resolver;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);System.out.println("BookGallery: onCreate.... ");setContentView(R.layout.main);etTitle = (EditText) findViewById(R.id.ettitle);etPrice = (EditText) findViewById(R.id.etprice);btnAdd = (Button) findViewById(R.id.add);btnDelete = (Button) findViewById(R.id.delete);lvBooks = (ListView) findViewById(R.id.booklist);resolver = getContentResolver();registMyContentObserver();Cursor cs = resolver.query(Book.CONTENT_URI, null, null, null, Book.ID+ " ASC");CursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, cs, new String[] {Book.TITLE, Book.PRICE }, new int[] {android.R.id.text1, android.R.id.text2 });lvBooks.setAdapter(adapter);btnAdd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubContentValues contentValues;try {String countryText = String.valueOf(etTitle.getText());String codeNum = String.valueOf(etPrice.getText());contentValues = new ContentValues();contentValues.put(Book.TITLE, countryText);contentValues.put(Book.PRICE, codeNum);} catch (Exception e) {contentValues = new ContentValues();}resolver.insert(Book.CONTENT_URI, contentValues);}});btnDelete.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubUri uri = ContentUris.withAppendedId(Book.CONTENT_URI, 2);System.out.println("btnDelete.setOnClickListener...."+ uri.toString());resolver.delete(uri, null, null);}});}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();unregistMyContentObserver();}
}

  

  provider类

package com.android.provider.book;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.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;public class BookProvider extends ContentProvider {public class BookDatabasehelper extends SQLiteOpenHelper {public BookDatabasehelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("BookDatabasehelper onCreate... ");db.execSQL("CREATE TABLE " + Book.TABLE_NAME + " (" + Book.ID+ " INTEGER PRIMARY KEY," + Book.TITLE + " TEXT,"+ Book.PRICE + " TEXT" + ");");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("BookDatabasehelper onUpgrade... ");Log.w("BookDatabasehelper", "Upgrading database from version "+ oldVersion + " to " + newVersion+ ", which will destroy all old data");db.execSQL("DROP TABLE IF EXISTS notes");onCreate(db);}}public BookDatabasehelper databasehelper;public static final UriMatcher uriMatcher;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(Book.AUTHORITY, "item", Book.ITEM);uriMatcher.addURI(Book.AUTHORITY, "item/#", Book.ITEM_ID);}@Overridepublic int delete(Uri uri, String where, String[] args) {// TODO Auto-generated method stubSystem.out.println("BookProvider delete....");SQLiteDatabase db = databasehelper.getWritableDatabase();int count;switch (uriMatcher.match(uri)) {case Book.ITEM:count = db.delete(Book.TABLE_NAME, where, args);System.out.println("BookProvider delete....count" + count);break;case Book.ITEM_ID:String id = uri.getPathSegments().get(1);count = db.delete(Book.TABLE_NAME,Book.ID+ "="+ id+ (!TextUtils.isEmpty(where) ? " AND (" + where+ ')' : ""), args);System.out.println("BookProvider delete....count" + count + "id="+ id);break;default:throw new IllegalArgumentException("Unknown URI " + uri);}getContext().getContentResolver().notifyChange(uri, null);return count;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubSystem.out.println(" BookProvider getType...");int code = uriMatcher.match(uri);switch (code) {case Book.ITEM:System.out.println(" BookProvider getType..." + Book.CONTENT_TYPE);return Book.CONTENT_TYPE;case Book.ITEM_ID:System.out.println(" BookProvider getType..."+ Book.CONTENT_ITEM_TYPE);return Book.CONTENT_ITEM_TYPE;default:throw new IllegalArgumentException("Unknown URI " + uri);}}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSystem.out.println("BookProvider insert...");SQLiteDatabase db = databasehelper.getWritableDatabase();long rowId;if (uriMatcher.match(uri) != Book.ITEM) {throw new IllegalArgumentException("Unknown URI " + uri);}rowId = db.insert(Book.TABLE_NAME, Book.ID, values);if (rowId > 0) {Uri noteUri = ContentUris.withAppendedId(Book.CONTENT_URI, rowId);System.out.println("BookProvider insert  notifyChange");getContext().getContentResolver().notifyChange(noteUri, null);return noteUri;}throw new SQLException("Failed to insert row into " + uri);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubSystem.out.println("BookProvider  onCreate:");databasehelper = new BookDatabasehelper(getContext(),Book.DATABASE_NAME, null, Book.VERSION);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSystem.out.println("BookProvider  query:");SQLiteDatabase db = databasehelper.getReadableDatabase();Cursor c;switch (uriMatcher.match(uri)) {case Book.ITEM:c = db.query(Book.TABLE_NAME, projection, selection, selectionArgs,null, null, sortOrder);System.out.println("BookProvider  query:" + Book.CONTENT_TYPE);break;case Book.ITEM_ID:String id = uri.getPathSegments().get(1);c = db.query(Book.TABLE_NAME, projection, Book.ID+ "="+ id+ (!TextUtils.isEmpty(selection) ? " AND (" + selection+ ')' : ""), selectionArgs, null, null, sortOrder);System.out.println("BookProvider  query:" + Book.CONTENT_ITEM_TYPE);break;default:throw new IllegalArgumentException("Unknown URI " + uri);}c.setNotificationUri(getContext().getContentResolver(), uri);return c;}@Overridepublic int update(Uri uri, ContentValues values, String where, String[] args) {// TODO Auto-generated method stubSystem.out.println("BookProviderupdate.... ");SQLiteDatabase db = databasehelper.getWritableDatabase();int count;switch (uriMatcher.match(uri)) {case Book.ITEM:count = db.update(Book.TABLE_NAME, values, where, args);break;case Book.ITEM_ID:String id = uri.getPathSegments().get(1);count = db.update(Book.TABLE_NAME, values,Book.ID+ "="+ id+ (!TextUtils.isEmpty(where) ? " AND (" + where+ ')' : ""), args);break;default:throw new IllegalArgumentException("Unknown URI " + uri);}getContext().getContentResolver().notifyChange(uri, null);return count;}}

  

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.android.provider.book"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><provider android:name="BookProvider"  android:authorities="com.android.provider.book" /></application><uses-sdk android:minSdkVersion="3" /></manifest>

  

要点:

getType(Uri uri)

单item vnd.android.cursor.item

多item  vnd.android.cursor.dir/

Implement this to handle requests for the MIME type of the data at the given URI. The returned MIME type should start with vnd.android.cursor.item for a single record, or vnd.android.cursor.dir/ for multiple items. This method can be called from multiple threads, as described in Processes and Threads.

Note that there are no permissions needed for an application to access this information; if your content provider requires read and/or write permissions, or is not exported, all applications can still call this method regardless of their access permissions. This allows them to retrieve the MIME type for a URI when dispatching intents.

getContentResolver().notifyChange(uri, null) contentobserver 观察者

 

转载于:https://www.cnblogs.com/wjw334/p/3594501.html

Android ContentProvider相关推荐

  1. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

    在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...

  2. Android ContentProvider和getContentResolver

    安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器. 关于SqlLite数据库的文章 ...

  3. Android ContentProvider介绍

    在Android中数据的存储一共有五种形式,分别是:Shared Preferences.网络存储.文件存储,外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据 ...

  4. Android ContentProvider、ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之中的一个,可见它在Android中的作用非 ...

  5. Android ContentProvider的介绍

    一.ContentProvider的概念 ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见的一些数据提供了默认的Content ...

  6. android uri db,Android ContentProvider封装数据库和文件读写总结

    本文是我各处东拼西凑加上自己实现一个ContentProvider的使用总结,留做后用,主要介绍ContentProvider的集成方法. 一.综述 ContentProvider是Android四大 ...

  7. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯

    1.客户端代码: 先实现服务端 SQL创建: public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final S ...

  8. android contentprovider api,Content Provider Basics

    一个内容提供者访问数据的中央资源库.提供者是应用程序的一部分,提供自己的操作数据的UI.然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者.提供者和提供者客户端为数据提供一个一致的 ...

  9. android 获取phone实例,Android ContentProvider获取手机联系人实例

    在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家 ...

最新文章

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理
  2. 在树莓派上安装AdGuardHome当DNS服务器,来屏蔽广告和追踪的DNS请求
  3. chart 模板 - 每天5分钟玩转 Docker 容器技术(165)
  4. FIELD-SYMBOLS详解
  5. 使用qtcreator中的git_Git中submodule的使用
  6. 2017年秋招-广联达面试及思考
  7. SessionState详解
  8. unittest测试框架详谈及实操(四)
  9. 为啥你写的代码老有大串的if/else?
  10. int 与Integer的用法与区别
  11. PAT 乙级 1027. 打印沙漏(20) Java版
  12. [ POI 2005 ] Bank Notes
  13. 19道小米网络运维工程师笔试真题,你能通关吗?
  14. openwrt官方固件怎么中继网络
  15. INFO Starting development server...98% after emitting CopyPlugin ERROR Failed to compile with
  16. RabbitMQ核心功能介绍
  17. A3NCF: An Adaptive Aspect Attention Model for Rating Prediction
  18. 移动硬盘(USB3.0)1TB 在自己电脑上突然识别不了
  19. 《程序员的创世传说》第三节 魔王与2012
  20. 新型高科技口罩即将成为一种身份象征

热门文章

  1. 骁龙820和KryoCPU:异构计算与定制计算的作用 【转】
  2. tomcat启动报:No Spring WebApplicationInitializer types detected on classpath
  3. Python 字符串的内置函数
  4. php 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
  5. Java学习——Java运算符
  6. 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
  7. DM365 u-boot启动分析
  8. 路由器与交换机的工作原理
  9. MPEG2、H.263、H.264协议效率对比
  10. 三极管基本参数介绍与放大电路分析