Android存储--ContentProvider

一, 什么是ContentProvider
是所有应用程序之间数据存储和检索的桥梁,  作用  是实现各个应用程序之间数据的共享
是应用程序之间数据共享的唯一方式
   注意:
如果想要访问内容提供者提供的数据, 那么需要通过 ContentResolver对象获取数据的内容
如果想要共享自己应用程序中的数据, 那么需要自定义一个内容提供者, 然后把自己的数据共享出去
二, 作用
将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式  ,向外提供数据访问的接口
三, URI   统一资源标识符   (在应用程序中是唯一的)
格式:  content://应用程序的包名.provider/表名(一般自定义)
,   分析
ContentResolver    内容解析器    负责解析ContentProvider暴露出来的数据   "客户端"
ContentProvider      内容提供者    负责暴露数据                 "服务器"

实例:

1,访问联系人列表
1, 得到内容解析器对象:   ContentResolver
2, 通过URI格式  解析数据(Cursor)
3, 在清单文件中添加读取短信的权限

  raw_contacts (有多少个联系人 就有多少条数据)
_id     dispaly_name
  mimetypes(数据的类型)
_id   mimetype  (1  邮箱   5  电话    7 姓名)
  data(实际的内容)  同一个人会有多条数据,   姓名 , 电话,  邮箱  ....
_id  
raw_contact_id    (raw_contacts表的外键)
mimetype_id        (mimetypes的外键)

代码实现:

public class MainActivity extends Activity {
	private ListView lv;
	private SimpleAdapter adapter;
	private List<Map<String, Object>> data;
	private ContentResolver resolver;
	private Uri uri = ContactsContract.Contacts.CONTENT_URI;
	private Uri phoneuri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
	private Uri emailuri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv = (ListView) findViewById(R.id.lv);
		data = getData();
		adapter = new SimpleAdapter(this, data, R.layout.lvitem, new String[] {
				"id", "name", "phone", "email" }, new int[] { R.id.id,
				R.id.name, R.id.phone, R.id.email });
		lv.setAdapter(adapter);
	}
	private List<Map<String, Object>> getData() {
		// TODO Auto-generated method stub
		List<Map<String, Object>> resultdata = new ArrayList<Map<String, Object>>();
		Map<String, Object> map;
		// 获取数据
		resolver = getContentResolver();
		Cursor cursor = resolver.query(uri, null, null, null, null);
		while (cursor.moveToNext()) {
			map = new HashMap<String, Object>();
			int id = cursor.getInt(cursor
					.getColumnIndex(ContactsContract.Contacts._ID));
			String name = cursor.getString(cursor
					.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
			map.put("id", id);
			map.put("name", name);

			String phone = "该用户暂时没有电话";
			Cursor cursor1 = resolver.query(phoneuri, null, "raw_contact_id=?",
					new String[] { id + "" }, null);
			while (cursor1.moveToNext()) {
				phone = cursor1
						.getString(cursor1
								.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
			}
			map.put("phone", phone);
			String email = "该用户暂时没有邮箱";
			Cursor emailCursor = resolver.query(emailuri, null,
					"raw_contact_id =?", new String[] { id + "" }, null);
			while (emailCursor.moveToNext()) {
				email = emailCursor
						.getString(emailCursor
								.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
			}
			map.put("email", email);

			resultdata.add(map);
		}
		return resultdata;
	}
}
自定义的ContentProvider
1, 定义一个类, 继承ContentProvider, 重写父类的6个方法
    onCreate()   初始化数据库的操作
    query(Uri uri,...)
    insert(Uri uri,...)
    delete(Uri uri,...)
    update(Uri uri,...)
    getType()  只实现, 不做处理
2, 声明ContentProvider的唯一标识(内容为小写的字母, 建议 : 包名+数据库的名称)
3, 声明访问数据库的Code码(是在CotentProvider暴露数据时, 使用)
4, 定义Uri的匹配器  UriMatcher , 并且实例化, 同时注册Uri
private static UriMatcher uriMatcher ;
static
{
uriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
}
5, 定义一个数据库的帮助类, 并在onCreate() 方法中完成数据表的初始
6, 在相应的增 删  改  查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
if(uriMatcher.match(uri) == code)
{........}
7, 在清单文件中, 注册ContentProvider 
<provider    
android:name=""   说明注册的是那个CotentProvider   全类名
android:authorities=""   与CotentProvider中的 唯一标识完全一直
android:exported=""    声明当前应用程序  可以被外部的应用程序访问/>

实例:


public class DataOpenHelp extends SQLiteOpenHelper {

	public DataOpenHelp(Context context) {
		super(context, "nba", null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL("create table t_user(_id integer primary key  autoincrement, uname,upwd,umoney)");
		db.execSQL("create table t_order(_id integer primary key  autoincrement, product_name,price,user_id)");

		db.execSQL("insert into t_user(uname,upwd,umoney) values('詹姆斯','123','100')");
		db.execSQL("insert into t_user(uname,upwd,umoney) values('科比','667','100')");
		db.execSQL("insert into t_user(uname,upwd,umoney) values('库里','321','100')");
		db.execSQL("insert into t_user(uname,upwd,umoney) values('汤普森','135','100')");
		db.execSQL("insert into t_user(uname,upwd,umoney) values('欧文','165','100')");
		db.execSQL("insert into t_user(uname,upwd,umoney) values('杜兰特','145','100')");
	}

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

	}

public class UserContentProvider extends ContentProvider {
	private DataOpenHelp openHelp;

	private static final int USER_CODE = 0;
	private static final int ORDER_CODE = 1;

	private static UriMatcher uriMatcher;

	private static String AUTHORITY = "com.example.day46_contentprovider_03.nba";

	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

		uriMatcher.addURI(AUTHORITY, "t_user", 0);
		uriMatcher.addURI(AUTHORITY, "t_order", 1);
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		openHelp = new DataOpenHelp(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		SQLiteDatabase db = openHelp.getWritableDatabase();
		Cursor sCursor = null;
		switch (uriMatcher.match(uri)) {
		case USER_CODE:

			sCursor = db.query("t_user", null, selection, selectionArgs, null,
					null, null);

			break;
		case ORDER_CODE:
			sCursor = db.query("t_order", null, selection, selectionArgs, null,
					null, null);

			break;
		}

		return sCursor;
	}

	@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
		SQLiteDatabase db = openHelp.getWritableDatabase();
		long id;
		if (uriMatcher.match(uri) == USER_CODE) {
			id = db.insert("t_user", null, values);
			return ContentUris.withAppendedId(uri, id);
		}
		if (uriMatcher.match(uri) == ORDER_CODE) {
			id = db.insert("t_order", null, values);
			return ContentUris.withAppendedId(uri, id);
		}

		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		SQLiteDatabase db = openHelp.getWritableDatabase();
		int count = 0;

		if (uriMatcher.match(uri) == USER_CODE) {
			count = db.delete("t_user", selection, selectionArgs);
		}

		return count;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = openHelp.getWritableDatabase();

		int count = 0;
		if (uriMatcher.match(uri) == USER_CODE) {
			count = db.update("t_user", values, selection, selectionArgs);
		}

		return count;
	}

}

<provider 
            android:name="com.example.contentprovider_03DB.UserContentProvider"
            android:authorities="com.example.day46_contentprovider_03.nba"
            android:exported="true"
            />
ContentResolver部分:

public class MainActivity extends Activity {
	private ListView lv;
	private SimpleCursorAdapter list;
	private ContentResolver resolver;
	private Uri uri = Uri
			.parse("content://com.example.day46_contentprovider_03.nba/t_user");
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		lv = (ListView) findViewById(R.id.lv);
		resolver = getContentResolver();
	}
	public void show(View v) {
		Cursor cursor = resolver.query(uri, null, null, null, null);
		list = new SimpleCursorAdapter(this, R.layout.lvitem, cursor,
				new String[] { "uname", "upwd" },
				new int[] { R.id.t1, R.id.t2 },
				SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
		lv.setAdapter(list);
	}

	public void insert(View v) {
		ContentValues values = new ContentValues();
		values.put("uname", "哈登");
		values.put("upwd", "09876");
		resolver.insert(uri, values);
		show(null);
	}

	public void update(View v) {
		ContentValues values = new ContentValues();
		values.put("uname", "哈登1111");
		resolver.update(uri, values, "upwd = ?", new String[] { "09876" });
		show(null);
	}
	public void delete(View v) {
	resolver.delete(uri, "_id=?", new String[] { "1" });
		show(null);
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值