`

ContentProvider初体验

 
阅读更多

ContentProvider在安卓开发中非常重要。与Activity,Service,BroadcastReceiver并称安卓组件四大天王。

在android中的作用是用来对外共享数据。因为安卓程序的数据库文件存放在data/data/packagename里面,这里面的文件默认都是私有的,别的程序无法访问。

如果QQ游戏想访问手机QQ的帐号信息一键登录,那么就需要使用内容提供者COntentPrivoder来访问。

最常用的就是开发一个程序读取系统的联系人。

 

实现步骤:
1、写好数据库的增删改查。

package com.hb.db;

import java.util.ArrayList;

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

import com.hb.bean.User;

public class DBHelp extends SQLiteOpenHelper {

	public DBHelp(Context context) {
		super(context, "Test", null, 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String createTable = "create table users (_id integer primary key autoincrement,name text,phone text)";
		db.execSQL(createTable);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}

	public void add(User user) {
		SQLiteDatabase database = getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", user.getName());
		values.put("phone", user.getPhone());
		database.insert("users", null, values);
		database.close();
	}

	public void delete(User user) {
		SQLiteDatabase database = getWritableDatabase();
		database.delete("users", "name = ? or phone = ?",
				new String[] { user.getName(), user.getPhone() + "" });
		database.close();
	}


	public ArrayList<User> getData() {
		ArrayList<User> list = new ArrayList<User>();
		// 获得所有的数据
		String sql = "select * from users";
		SQLiteDatabase sdb = this.getReadableDatabase();
		Cursor cursor = sdb.rawQuery(sql, null);
		while (cursor.moveToNext()) {
			String name = cursor.getString(1);
			String phone = cursor.getString(2);
			list.add(new User(Long.parseLong(phone), name));
		}
		cursor.close();
		sdb.close();
		return list;
	}

}

 

2、写内容提供者MyProvider继承ContentProvider,使用静态块初始化UriMatcher,重写ContentProvider里面的6个方法

 

static {

matcher = new UriMatcher(UriMatcher.NO_MATCH);

// 查询

matcher.addURI("com.hb.provider", "get", 10);

// 插入

matcher.addURI("com.hb.provider", "insert", 20);

// 删除

matcher.addURI("com.hb.provider", "delete/#", 30);

}

 

 

只实现了delete,querry,insert方法,update类似

package com.hb.provider;

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

import com.hb.db.DBHelp;

public class MyProvider extends ContentProvider {

	static UriMatcher matcher;

	static {
		matcher = new UriMatcher(UriMatcher.NO_MATCH);
		// 查询
		matcher.addURI("com.hb.provider", "get", 10);
		// 插入
		matcher.addURI("com.hb.provider", "insert", 20);
		// 删除
		matcher.addURI("com.hb.provider", "delete/#", 30);
	}

	@Override
	public boolean onCreate() {
		return true;
	}

	/**
	 * uri,要查询的字段名,where条件,where语句中?的值,排序字段
	 */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		int code = matcher.match(uri);
		Log.i("Test", code + "");
		switch (code) {
		case 10:
			DBHelp db = new DBHelp(getContext());
			Cursor cursor = db.getReadableDatabase().rawQuery(
					"select * from users", null);
			return cursor;
		}
		return null;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int code = matcher.match(uri);
		switch (code) {
		case 20:
			DBHelp db = new DBHelp(getContext());
			long id = db.getWritableDatabase().insert("users", null, values);
			return ContentUris.withAppendedId(uri, id);
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int code = matcher.match(uri);
		switch (code) {
		case 30:
			DBHelp db = new DBHelp(getContext());
			int id = db.getWritableDatabase().delete("users", selection,
					selectionArgs);
			return id;
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		return 0;
	}

}

 

一定要记得在AndroidMenifest清单文件里注册,它和Activity一样,放在Application节点下

<provider

            android:name="com.hb.provider.MyProvider"

            android:authorities="com.hb.provider" >

        </provider>

 

此时,内容提供者就已经写好了。再写另外一个程序对其数据库进行操作。

 

3、写其他程序访问内容提供者

  在Activity里面,可以使用context调用getContentResolver()方法得到ContentResolver resolver = getContentResolver();

,之后就可以使用resolver对数据库进行操作了。

首先,会根据uri找到对应的应用程序,再根据insert之类的子命令找到对应定义号的code(20),执行MyProvider里面的insert方法。其中uri中的“content://”是内容提供者的固定写法。

package com.example.testprovider;

import java.util.ArrayList;

import com.hb.bean.User;

import 

android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import 

android.view.View;

public class MainActivity extends Activity {

	private ContentResolver resolver;

	

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate

(savedInstanceState);
		setContentView(R.layout.activity_main);
		resolver = 

this.getContentResolver();
	}

	public void delete(View v) {
		Uri uri = Uri.parse

("content://com.hb.provider/delete/1");
		// 删除phone为123的人
		int count = resolver.delete

(uri, "phone = ?",
				new String[] { "123" });
		Log.i("Test", count + 

"条数据被删除");
	}

	public void querry(View v) {
		Uri uri = Uri.parse

("content://com.hb.provider/get");
		Cursor cursor = 

resolver.query(uri, null, null, null, null);
		if (cursor != null) {
			

ArrayList<User> list = new ArrayList<User>();
			while (cursor.moveToNext()) {
			

	String name = cursor.getString(1);
				String phone = cursor.getString(2);
	

			list.add(new User(Long.parseLong(phone), name));
			}
		

	Log.i("Test", list.toString());
		} else {
			Log.i("Test", "没查到");
	

	}
	}

	public void insert(View v) {
		Uri uri = Uri.parse

("content://com.hb.provider/insert");
		ContentValues values = new ContentValues();
		

values.put("name", "name");
		values.put("phone", "111");
		resolver.insert(uri, values);
	

}

}

 

  • CP.zip (3.3 MB)
  • 下载次数: 1
0
0
分享到:
评论

相关推荐

    安卓开发课程表源码来了

    一个标准的Android应用通常由多个组件构成,包括Activity(界面)、Service(后台服务)、BroadcastReceiver(广播接收者)以及ContentProvider(数据提供者)。在课程表应用中,Activity将用于展示课程信息,可能...

    LoadSQLiteManager:用异步加载数据库(LoaderManager,ContentProvider,ContentResolver,SQLiteOpenHelper)

    在Android开发中,数据库操作是应用的核心功能之一。`LoadSQLiteManager`是一个示例项目,展示了如何使用异步方式加载SQLite...在实际开发中,这样的设计模式有助于提高应用性能,减少UI阻塞,并提供更好的用户体验。

    初中级Android开发社招面试之性能优化.zip

    在Android应用开发中,性能优化是一项至关重要的技能,尤其对于初中级开发者来说,掌握这方面的知识不仅能够提升应用的用户体验,还能在面试中展现自己的专业素养。本篇内容将聚焦于Android开发中的性能优化,主要从...

    android真实项目教程(二)——漫画App初构_by_CJJ

    在本篇“Android真实项目教程(二)——漫画App初构_by_CJJ”中,我们将深入探讨如何构建一个基础的漫画阅读应用。这个教程由CJJ提供,专注于Android平台的开发,是Android开发者学习实际项目经验的良好资源。下面,...

    史上最简单,适合初手的安卓音乐播放器源代码

    一个基本的Android应用由多个组件构成,包括Activity、Service、BroadcastReceiver、ContentProvider等。在这个简单的音乐播放器中,最核心的组件可能是Activity,因为它负责用户界面的交互。开发者可能使用了...

    Android应用源码之初初级记事本程序,直接写文件-IT计算机-毕业设计.zip

    一个标准的Android应用由多个组件构成,包括Activity、Service、BroadcastReceiver、ContentProvider等。在这个初级记事本应用中,主要涉及的是Activity,它是用户界面的主要载体。开发者通常会创建一个或多个...

    Android例子大全

    这个初体验章节主要涵盖了以下几个核心知识点: 1. **Android程序架构**:Android应用程序基于Java语言,采用组件化的方式构建,主要包括Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)、...

    Android 典型技术模块开发详解 代码

    本资料集合包含了多个关键的Android模块开发的源代码,适合初入Android开发领域的工作者学习和参考。通过深入理解和实践这些代码,开发者可以对Android应用的各个层面有更全面、深入的理解。 1. **Activity与Intent...

    陌陌android源码-代码写的很不错

    这些都是Android应用性能优化的关键技术,能帮助开发者理解如何避免阻塞主线程,提升用户体验。 事件总线(如EventBus)和依赖注入框架(如Dagger)的应用也是现代Android开发的常见实践。通过陌陌源码,我们可以...

    基于Android的超强功能通讯录.zip

    这个项目适用于初入IT行业的毕业生,特别是那些对Android开发感兴趣的学生或者开发者。它支持使用Android Studio、IntelliJ IDEA以及Eclipse进行开发,但推荐使用前两者,因为它们提供了更现代、更强大的集成开发...

    Android开发教程

    总的来说,《Android开发教程》是全面而深入的,涵盖了Android开发的各个方面,无论你是初入此领域的新手,还是寻求提高的开发者,都能从中受益匪浅。通过阅读这本书,你将能够熟练地开发出自己的Android应用程序,...

    两本Android中文书籍

    总之,"Android程序员指南"与"應用框架原理與程式计36技"两本书是Android开发者的重要参考资料,无论你是初入行业的新人还是寻求突破的资深开发者,都能从中受益匪浅。通过系统学习和实践,你将能够构建出高效、稳定...

    Android 典型技术模块开发详解 pdf

    《Android典型技术模块开发详解》这本书是为初入Android开发领域的工作者量身打造的指南,旨在帮助读者深入理解和掌握Android各个关键模块的开发技术。在本文中,我们将详细探讨书中可能涉及的重要知识点,并尽可能...

    Android开发进阶从小工到专家(书签版)

    《Android开发进阶从小工到专家》是由资深Android开发者何红辉编著的一本专业书籍,旨在帮助初入Android开发领域的工程师逐步提升技能,直至达到专家级别。这本书以清晰的结构和高清的书签版形式呈现,使得学习过程...

    安卓期末大作业,装修建材App包含登录注册含数据库,Androidstudio开发适合初学者使用

    使用SQL语句进行数据的增删改查,并通过Android的ContentProvider或Room库封装数据库操作,提供更安全、高效的访问方式。 此外,App可能还包含其他功能,如建材商品展示、分类、搜索、购物车等。这需要开发者掌握...

    Android_应用框架原理与程序开发 免费

    Android的视图系统是构建用户界面的基础,掌握如何有效地布局和设计UI对于提升用户体验有着决定性的影响。 在程序开发方面,本书会介绍Android Studio的使用,包括项目构建、调试技巧以及Gradle构建系统。还会涉及...

    基于android的音乐播放器的设计说明.doc

    - **ContentProvider**:存储和检索数据,并让这些数据可以被其他应用程序访问。 #### 5. 音乐播放器功能实现 - **播放/暂停功能**:利用MediaPlayer类实现音乐的播放与暂停操作。 - **上一曲/下一曲**:通过维护...

    Google Android SDK开发范例大全 前四章

    通过"手机控制项.pdf"、"使用者人机界面+SDK-Google+Android+SDK开发范例大全.pdf"和"Android初体验.pdf"这三份文档,读者可以深入学习到实际的案例和实践,从而将理论知识转化为实际的编程技能。这些文档可能包含...

    AndroidBox0.5

    无论你是初入Android世界的新人,还是经验丰富的老手,都能从中受益匪浅。 首先,让我们来看看AndroidBox0.5中的核心知识点——Android组件。Android四大组件(Activity、Service、BroadcastReceiver、...

Global site tag (gtag.js) - Google Analytics