Android ContentProvider

ContentProvider是不同应用程序间数据交换的标准API;

ContentProvider使用表来组织数据

 

一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,,其他应用程序都可以通过该接口来操作应用程序内部的数据(插查修删)

操作的大部分数据是来自数据库有时候也使用文件xml和网络

 

应用程序A可以通过ContentProvider向系统提供访问接口。并提供标识:android:authorities=xxx

其他应用程序可以通过ContentResolver获得系统的访问接口。根据xxx找到A的API。

两边都实现了插入,查询,修改,删除的操作。

 

实现ContentProvider的步骤:

1. 开发一个ContentProvider子类并实现“插查修删”接口

2. 在AndroidManifest.xml中配置ContentProvider

 

ContentResolver 使用 

1. 获得系统的ContentResolver。contentResolver = getContentResolver();

2. 调用ContentResoler的“插查修删”方法

3. 方法参数如

public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder)


 Uri就是Provider的标识,用来区分不同的ContentProvider。

 第二个参数projection 代表要返回的内容,实际就是列的名字。

 第三个参数selection 设置条件,当于SQL语句中的where后面的。null表示不进行筛选。

 第四个参数selectionArgs,配合第三个参数使用,如果第三个参数中有?,则在selectionArgs会替换掉?,可为null

 第五个参数sortOrder,按照什么进行排序,相当于SQL语句中的Order by后面的如“DSEC”

 

 

代码:

package com.contentproviderdemo;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

public class MyContentProvider extends ContentProvider {

	private String TAG = "MyContentProvider";

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub

		Log.v(TAG, "=== delete ===");
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		Log.v(TAG, "=== insert ===");
		return null;
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		Log.v(TAG, "=== onCreate ===");
		return false;
	}

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

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

}


配置ContentProvider

 

        <provider
            android:name="com.contentproviderdemo.MyContentProvider"
            android:authorities="com.contentproviderdemo.mycontentprovider"
            android:exported="true" >
        </provider>


 

ContentResolver的使用

package com.contentresolverdemo;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	ContentResolver contentResolver;
	Uri uri = Uri.parse("content://com.contentproviderdemo.mycontentprovider");

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 获得系统的ContentResolver服务
		contentResolver = getContentResolver();
		
		
		
		
		

		View.OnClickListener listener = new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				switch (v.getId()) {

				case R.id.button1:// 插入

					ContentValues values = new ContentValues();
					values.put("name", "fkjava");

					Uri newUri = contentResolver.insert(uri, values);
					Toast.makeText(MainActivity.this,
							"远程的ContentProvider新插入记录的Uri: " + newUri,
							Toast.LENGTH_SHORT).show();
					break;
				case R.id.button2:// 查询

					Cursor cursor = contentResolver.query(uri, null,
							"quary_where", null, null);
					Toast.makeText(MainActivity.this,
							"远程的ContentProvider返回的Cursor: " + cursor,
							Toast.LENGTH_SHORT).show();

					break;
				case R.id.button3:// 修改
					ContentValues values2 = new ContentValues();
					values2.put("name", "fkJava");
					int count = contentResolver.update(uri, values2,
							"update_where", null);
					Toast.makeText(MainActivity.this,
							"远程的ContentProvider update()的返回值: " + count,
							Toast.LENGTH_SHORT).show();
					break;
				case R.id.button4:// 删除
					int count1 = contentResolver.delete(uri, "delete_where",
							null);
					Toast.makeText(MainActivity.this,
							"远程的ContentProvider 删除的记录数为: " + count1,
							Toast.LENGTH_SHORT).show();
					break;

				default:
					break;
				}

			}
		};

		findViewById(R.id.button1).setOnClickListener(listener);
		findViewById(R.id.button2).setOnClickListener(listener);
		findViewById(R.id.button3).setOnClickListener(listener);
		findViewById(R.id.button4).setOnClickListener(listener);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

 

 参考:

 http://blog.csdn.net/wssiqi/article/details/8132603

 

=====================================================

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值