contentprovider

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

总结:
1、ContentProvider为存储和读取数据提供了统一的接口
2、使用ContentProvider,应用程序可以实现数据共享
3、android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)

Uri介绍:

1、每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider提供的数据
2、Android所提供的ContentProvider都存放在andriod.provider这个包里面

Android的ContentProvider URI有固定的形式:content://contract/people

前缀:固定为content : //
认证:contract 资源的唯一标识符
路径:people 具体的资源类型

在Android中广泛应用URI,而不是URL。URL标识资源的物理位置,相当于文件的路径;而URI则是标识资源的逻辑位置,并不提供资源的具体位置。比如说电话薄中的数据,如果用URL来标识的话,可能会是一个很复杂的文件结构,而且一旦文件的存储路径改变,URL也必须得改动。但是若是URI,则可以用诸如content://contract/people这样容易记录的逻辑地址来标识,而且并不需要关心文件的具体位置,即使文件位置改动也不需要做变化,当然这都是对于用户来说,后台程序中URI到具体位置的映射还是需要程序员来改动的。

ContentProvider提供的函数:

1、query() 查询
2、insert() 插入
3、update() 更新
4、delete() 删除
5、getType() 得到数据类型
6、onCreate() 创建时的回调函数

实现ContentProvider的过程:

1、定义一个COTENT_URI常量
2、定义一个类,继承ContentProvider
3、实现query(),delete(),update(),insert(),onCreate(),getType()方法
4、在AndroidMainfest.xml中申明

下面是一个使用ContentProvider进行CRUD操作的例子。

IProivderMetaData.java

package com.liuzhichao.privoder;

import android.net.Uri;
import android.provider.BaseColumns;

public interface IProivderMetaData {

	// 定义外部访问的Authority
	public static final String AUTHORITY = "com.liuzhichao.bookprovider";
	// 数据库名称
	public static final String DB_NAME = "book.db";
	// 数据库版本
	public static final int VERSION = 1;

	public interface BookTableMetaData extends BaseColumns {
		// 表名
		public static final String TABLE_NAME = "book";
		// 外部程序访问本表的uri地址
		public static final Uri CONTENT_URI = Uri.parse("content://"
				+ AUTHORITY + "/" + TABLE_NAME);

		// book表列名
		public static final String BOOK_ID = "_id";
		public static final String BOOK_NAME = "name";
		public static final String BOOL_PUBLISHER = "publisher";
		
		//默认排序
		public static final String SORT_ORDER="_id desc";
		//得到book表中的所有记录
		public static final String CONTENT_LIST="vnd.android.cursor.dir/vnd.bookprovider.book";
		//得到一个表信息
		public static final String CONTENT_ITEM="vnd.android.cursor.item/vnd.bookprovider.book";
	}
}

DBHelper.java

package com.liuzhichao.privoder;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper implements IProivderMetaData {

	private static final String TAG = "DBHelper";

	public DBHelper(Context context) {
		super(context, DB_NAME, null, VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String TABLESQL = "create table if not exists "
				+ BookTableMetaData.TABLE_NAME + " ("
				+ BookTableMetaData.BOOK_ID + " integer primary key,"
				+ BookTableMetaData.BOOK_NAME + " varchar,"
				+ BookTableMetaData.BOOL_PUBLISHER + " varchar)";
		db.execSQL(TABLESQL);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
				+ newVersion + ", which will destroy all old data");
		db.execSQL("DROP TABLE IF EXISTS " + DB_NAME);
		onCreate(db);
	}

}

BookContentProvider.java

package com.liuzhichao.privoder;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

public class BookContentProvider extends ContentProvider {

	private static final String TAG="BookContentProvider";
	private static UriMatcher uriMatcher = null;
	private static final int BOOKS = 1;
	private static final int BOOK = 2;

	private DBHelper dbHelper;
	private SQLiteDatabase db;
	/**
	 * 这部分就相当于为外部程序准备好一个所有地址匹配集合
	 */
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(IProivderMetaData.AUTHORITY,
				IProivderMetaData.BookTableMetaData.TABLE_NAME, BOOKS);
		uriMatcher.addURI(IProivderMetaData.AUTHORITY,
				IProivderMetaData.BookTableMetaData.TABLE_NAME+"/#", BOOK);
	}

	@Override
	public boolean onCreate() {
		dbHelper = new DBHelper(getContext());
		return (dbHelper == null) ? false : true;
	}

	// 取得数据的类型,此方法会在系统进行URI的MIME过滤时被调用。
	@Override
	public String getType(Uri uri) {
		switch (uriMatcher.match(uri)) {
		case BOOKS:
			return IProivderMetaData.BookTableMetaData.CONTENT_LIST;
		case BOOK:
			return IProivderMetaData.BookTableMetaData.CONTENT_ITEM;
		default:
			throw new IllegalArgumentException("This is a unKnow Uri"
					+ uri.toString());
		}
	}

	//增加
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		switch (uriMatcher.match(uri)) {
		case BOOKS:
			db = dbHelper.getWritableDatabase();//取得数据库操作实例 
			
			//执行添加,返回行号,如果主健字段是自增长的,那么行号会等于主键id 
			long rowId = db.insert(
					IProivderMetaData.BookTableMetaData.TABLE_NAME,
					IProivderMetaData.BookTableMetaData.BOOK_ID, values);
			Uri insertUri = Uri.withAppendedPath(uri, "/" + rowId);
			Log.i(TAG, "insertUri:"+insertUri.toString());
			//发出数据变化通知(book表的数据发生变化) 
			getContext().getContentResolver().notifyChange(uri, null);
			return insertUri;
		default:
			 //不能识别uri 
			throw new IllegalArgumentException("This is a unKnow Uri"
					+ uri.toString());
		}
	}

	//查询
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		db = dbHelper.getReadableDatabase();
		switch (uriMatcher.match(uri)) {
		case BOOKS:
			return db
					.query(IProivderMetaData.BookTableMetaData.TABLE_NAME,
							projection, selection, selectionArgs, null, null,
							sortOrder);
		case BOOK:
			long id = ContentUris.parseId(uri);  
            String where = "_id=" + id;  
            if (selection != null && !"".equals(selection)) {  
                where = selection + " and " + where;  
            }  
            return db.query(IProivderMetaData.BookTableMetaData.TABLE_NAME, projection, where, selectionArgs, null,  
                    null, sortOrder);  
		default:
			throw new IllegalArgumentException("This is a unKnow Uri"
					+ uri.toString());
		}
	}

	//删除
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		db = dbHelper.getWritableDatabase();
		switch (uriMatcher.match(uri)) {
		case BOOKS:
			return db.delete(IProivderMetaData.BookTableMetaData.TABLE_NAME, selection, selectionArgs);
		case BOOK:
			long id = ContentUris.parseId(uri);
			String where = "_id=" + id;
			if (selection != null && !"".equals(selection)) {
				where = selection + " and " + where;
			}
			return db.delete(IProivderMetaData.BookTableMetaData.TABLE_NAME, selection, selectionArgs);
		default:
			throw new IllegalArgumentException("This is a unKnow Uri"
					+ uri.toString());
		}
	}

	//更新
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		db = dbHelper.getWritableDatabase();
		switch (uriMatcher.match(uri)) {
		case BOOKS:
			return db.update(IProivderMetaData.BookTableMetaData.TABLE_NAME,
					values, null, null);
		case BOOK:
			long id = ContentUris.parseId(uri);
			String where = "_id=" + id;
			if (selection != null && !"".equals(selection)) {
				where = selection + " and " + where;
			}
			return db.update(IProivderMetaData.BookTableMetaData.TABLE_NAME,
					values, selection, selectionArgs);
		default:
			throw new IllegalArgumentException("This is a unKnow Uri"
					+ uri.toString());
		}
	}

}

ContentProviderDemoActivity.java

package com.liuzhichao.privoder;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ContentProviderDemoActivity extends Activity {

	private EditText et_bookId;
	private EditText et_bookName;
	private EditText et_bookPublisher;
	private Button btn_add;
	private Button btn_delete;
	private Button btn_update;
	private Button btn_query;
	private Button btn_showall;
	private Button btn_claer;

	ContentResolver contentResolver;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 取得ContentResolver对象
		contentResolver = this.getContentResolver();
		findViews();
	}

	void findViews() {
		// 根据id获取组件
		et_bookId = (EditText) findViewById(R.id.book_id);
		et_bookName = (EditText) findViewById(R.id.book_name);
		et_bookPublisher = (EditText) findViewById(R.id.book_publisher);
		btn_add = (Button) findViewById(R.id.btn_add);
		btn_delete = (Button) findViewById(R.id.btn_delete);
		btn_update = (Button) findViewById(R.id.btn_update);
		btn_query = (Button) findViewById(R.id.btn_query);
		btn_showall = (Button) findViewById(R.id.btn_showall);
		btn_claer = (Button) findViewById(R.id.btn_claer);

		// 设置按钮单击事件处理
		btn_add.setOnClickListener(ClickListener);
		btn_delete.setOnClickListener(ClickListener);
		btn_update.setOnClickListener(ClickListener);
		btn_query.setOnClickListener(ClickListener);
		btn_showall.setOnClickListener(ClickListener);
		btn_claer.setOnClickListener(ClickListener);
	}

	// 按钮事件处理
	private View.OnClickListener ClickListener = new OnClickListener() {
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.btn_add:
				long rowid = btnAddHandler();
				Toast.makeText(getApplicationContext(), "数据增加成功,编号:" + rowid, 1)
						.show();
				break;
			case R.id.btn_delete:
				long deleteRow=btnDeleteHandler();
				Toast.makeText(getApplicationContext(), "数据删除成功,删除了 "+deleteRow+" 行数据" , 1)
				.show();
				break;
			case R.id.btn_update:
				long updateRow=btnUpdateHandler();
				Toast.makeText(getApplicationContext(), "数据更新成功,更新了 "+updateRow+" 行数据" , 1)
				.show();
				break;
			case R.id.btn_query:
				btnQueryHandler();
				break;
			case R.id.btn_showall:
				startActivity(new Intent(getApplicationContext(), ShowAllBooksActivity.class));
				break;
			case R.id.btn_claer:
				et_bookId.setText("");
				et_bookName.setText("");
				et_bookPublisher.setText("");
				break;
			default:
				break;
			}

		}
	};

	/**
	 * 增加图书
	 * 
	 * @return
	 */
	private long btnAddHandler() {
		String bookname = et_bookName.getText().toString();
		String bookPubliser = et_bookPublisher.getText().toString();
		ContentValues values = new ContentValues();
		values.put(IProivderMetaData.BookTableMetaData.BOOK_NAME, bookname);
		values.put(IProivderMetaData.BookTableMetaData.BOOL_PUBLISHER,
				bookPubliser);
		Uri insertUri = contentResolver.insert(
				IProivderMetaData.BookTableMetaData.CONTENT_URI, values);
		return ContentUris.parseId(insertUri);
	}

	//删除
	private long btnDeleteHandler() {
		String bookId = et_bookId.getText().toString();
		long row=0;
		if (!"".equals(bookId) && bookId != null) {
			ContentValues values = new ContentValues();
			values.put(IProivderMetaData.BookTableMetaData.BOOK_ID, bookId);
			//根据id删除
			row=	contentResolver.delete(
					Uri.withAppendedPath(IProivderMetaData.BookTableMetaData.CONTENT_URI, bookId), "_id = ?",
					new String[] {bookId});
		} else {
			//删除所有
			row=	contentResolver.delete(
					IProivderMetaData.BookTableMetaData.CONTENT_URI, null,
					null);
		}
		return row;
	}

	//修改
	private long btnUpdateHandler() {
		String bookId = et_bookId.getText().toString();
		String bookname = et_bookName.getText().toString();
		String bookPubliser = et_bookPublisher.getText().toString();

		ContentValues values = new ContentValues();
		//values.put(IProivderMetaData.BookTableMetaData.BOOK_ID, bookId);
		values.put(IProivderMetaData.BookTableMetaData.BOOK_NAME, bookname);
		values.put(IProivderMetaData.BookTableMetaData.BOOL_PUBLISHER,
				bookPubliser);
		long rowid=0;
		if ("".equals(bookId) || bookId == null) {
			//更新所有
			rowid=contentResolver.update(
					IProivderMetaData.BookTableMetaData.CONTENT_URI, values,
					null, null);
		}else{
			//根据Id更新
			rowid=contentResolver.update(
					Uri.withAppendedPath(IProivderMetaData.BookTableMetaData.CONTENT_URI, bookId), values,
					"_id = ? ", new String[]{bookid});
		}
		return rowid;
	}

	//查询(根据Id查询)
	private void btnQueryHandler() {
		String bookId = et_bookId.getText().toString();
		ContentValues values = new ContentValues();
		values.put(IProivderMetaData.BookTableMetaData.BOOK_ID, bookId);
		Cursor cursor = contentResolver.query(
				IProivderMetaData.BookTableMetaData.CONTENT_URI, null,
				" _id = ?", new String[] { bookId }, null);
		if (cursor.moveToNext()) {
			et_bookName
					.setText(cursor
							.getString(
									cursor.getColumnIndex(IProivderMetaData.BookTableMetaData.BOOK_NAME))
							.toString());
			et_bookPublisher
					.setText(cursor
							.getString(
									cursor.getColumnIndex(IProivderMetaData.BookTableMetaData.BOOL_PUBLISHER))
							.toString());
		}
	}
}

 

ShowAllBooksActivity.java

package com.liuzhichao.privoder;

import android.app.ListActivity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;

public class ShowAllBooksActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ContentResolver contentResolver = getContentResolver();
		Cursor cursor = contentResolver.query(
				IProivderMetaData.BookTableMetaData.CONTENT_URI, null, null,
				null, null);

		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
				R.layout.list, cursor, new String[] {
						IProivderMetaData.BookTableMetaData.BOOK_ID,
						IProivderMetaData.BookTableMetaData.BOOK_NAME,
						IProivderMetaData.BookTableMetaData.BOOL_PUBLISHER },
				new int[] { R.id.book_id, R.id.book_name, R.id.book_publisher });

		setListAdapter(adapter);
	}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/bookid" />

    <EditText
        android:id="@+id/book_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/bookname" />

    <EditText
        android:id="@+id/book_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/bookpublisher" />

    <EditText
        android:id="@+id/book_publisher"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="text" />
    
    
    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <Button
        android:id="@+id/btn_add"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_add" />
    <Button
        android:id="@+id/btn_delete"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_delete" />
    <Button
        android:id="@+id/btn_update"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_update" />
    <Button
        android:id="@+id/btn_query"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn_query" />
       </LinearLayout>
 <Button
        android:id="@+id/btn_showall"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_showall" />
 <Button
        android:id="@+id/btn_claer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_clear" />
</LinearLayout>

不要忘了注册provider

<provider android:name=".BookContentProvider" android:authorities="com.liuzhichao.bookprovider"/>
运行结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值