android ContentProvider入门使用

本文详细介绍了Android中ContentProvider的使用方法,包括Server端创建数据库、定义权限及Client端请求权限的过程。通过具体代码示例展示了如何实现跨应用的数据共享。

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

声明:Server指的是提供数据库的应用,Client指的是使用数据库的应用


权限:如果Server的Provider标签没有加入任何权限,那么CLient不用声明任何权限,就是可以操作Server数据

           如果Server的Provider标签加入了权限,那么CLient必须声明权限,才可以操作Server数据,而且在Client的权限中<permission> 和<use-permission>都要加上


下面上核心代码:

首先是Server的代码

DataBaseHelper.java

package com.example.contentproviderserver;

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

public class DatabaseHelper extends SQLiteOpenHelper{
	private final static String NAME = "test_db";
	private String CREATE_TALBE1="create table table1(id INTEGER PRIMARY KEY AUTOINCREMENT,data varchar(20));";
	private String CREATE_TALBE2="create table table2(id2 int,data1 varchar(20));";
	
	
	
	public DatabaseHelper(Context context) {
		super(context, NAME, null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL(CREATE_TALBE1);
		db.execSQL(CREATE_TALBE2);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public SQLiteDatabase getReadableDatabase() {
		// TODO Auto-generated method stub
		return super.getReadableDatabase();
	}

	@Override
	public SQLiteDatabase getWritableDatabase() {
		// TODO Auto-generated method stub
		
		return super.getWritableDatabase();
	}
	

}

上面代码不做讲解,如果不明白,就去看一下sqlite数据库的知识。


MyProvider.java


package com.example.contentproviderserver;

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 MyProvider extends ContentProvider {

	private static final UriMatcher sUriMatcher;
	private DatabaseHelper mDatabaseHelper;
	private String TAG="MyProvider";
	static {
		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

		sUriMatcher.addURI("com.test.provider", "table1", 1);
		sUriMatcher.addURI("com.test.provider", "table1/#", 11);

		sUriMatcher.addURI("com.test.provider", "table2", 2);
		sUriMatcher.addURI("com.test.provider", "table2/#", 22);
		
		//如果有其他的表 可以继续增加。。。
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		int code;
		code = sUriMatcher.match(uri);
		SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
		switch (code) {
		case 1:
			db.delete("table1", selection, selectionArgs);
			break;
		case 2:
			db.delete("table2", selection, selectionArgs);
			break;
		case 11:
			Log.i(TAG, "匹配了单行。。。");
			db.delete("table1", selection, selectionArgs); 
			break;
		case 22:
			db.delete("table2", selection, selectionArgs); 
			break;

		}

		return 0;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		switch (sUriMatcher.match(uri)) {
		case 1:
		case 2:
			return "vnd.android.cursor.dir/provider";  //匹配整张表
		case 11:
		case 22:
			return "vnd.android.cursor.item/provider";  //匹配单行,个人感觉比较鸡肋。一般不匹配单行,除非效率要求很高
		default:
			return "error";
		}

	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		int code;
		code = sUriMatcher.match(uri);
		SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
		long rowID;
		Log.i(TAG, "insert code--->"+code);
		switch (code) {
		case 1:
			rowID=db.insert("table1", null, values);
			if(rowID<0){
				Log.i(TAG, "插入失败");
			}else{
				 Uri rowUri = ContentUris.withAppendedId(uri, rowID);
		            getContext().getContentResolver().notifyChange(rowUri, null);
		            return rowUri;
			}
			break;
		case 2:
			rowID=db.insert("table2", null, values);
			if(rowID<0){
				Log.i(TAG, "插入失败");
			}else{
				 Uri rowUri = ContentUris.withAppendedId(uri, rowID);
		            getContext().getContentResolver().notifyChange(rowUri, null);
		            return rowUri;
			}
			break;
		case 11:
//			db.insert("table1", null, values);
			break;
		case 22:
//			db.insert("table2", null, values);
			break;

		}

		
		
		
		return null;
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		mDatabaseHelper = new DatabaseHelper(getContext());
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

}

这里使用了UriMather来匹配Uri找到指定的表,从而操作表。。


Manifest.xml

在<application>标签内部加入

  <provider
            android:name="com.example.contentproviderserver.MyProvider"
            android:authorities="com.test.provider"
            android:readPermission="com.myprovider.read"
            android:writePermission="com.myprovider.write"
            android:enabled="true" >
        </provider>

好了 ,Server代码完毕。。


Client代码

MainActivity.java

package com.example.contentproviderclient;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{
Button bt1;
Button bt2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bt1=(Button)findViewById(R.id.bt1);
		bt2=(Button)findViewById(R.id.bt2);
		bt1.setOnClickListener(this);
		bt2.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		int id = v.getId();
		switch(id){
		case R.id.bt1:
			ContentValues cv = new ContentValues();
			cv.put("data", "我爱你");
			getContentResolver().insert(Uri.parse("content://com.test.provider/table1"),cv);
			
			break;
		case R.id.bt2:
			ContentValues cv1 = new ContentValues();
			cv1.put("data1", "我爱你");
			getContentResolver().insert(Uri.parse("content://com.test.provider/table2"),cv1);
			break;
		}
	}

	

}


Manifest.xml

<uses-permission android:name="com.myprovider.write" />
    <uses-permission android:name="com.myprovider.read" />

    <permission android:name="com.myprovider.write" />
    <permission android:name="com.myprovider.read" />
这四个标签缺一不可。

很简单,用一个ContentValues来组装数据,从而操作,这里只是举了插入的例子,关于查找,删除的例子,可以自己测试。


欢迎交流,转载请注明出处。谢谢

完整源码下载地址:http://download.youkuaiyun.com/detail/suixiang888/5952209


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值