`

Android四大组件之——ContentProvider

阅读更多

     在Android我们能通过建立当前应用的数据库SQLiteDataBase,供本应用对数据的存取。但当多个应用需要共用同一数据时,我们怎么办呢?在Android系统中没有一个公共的内存区域,供多个应用共享存储数据。这里就要用到ContentProvider(内容提供者)。

    Android中的ContentProvider机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。

    ContentProvider 实际上就是提供一个接口方法,多个应用可以通过接口方法访问同一数据库的内容,即用到ContentResolver(内容解析者)来调用方法。



 在配置文件中声明ContentProvider并设置权限(
authorities),其他应用通过权限获取访问内容提供者的资格。

 

<provider android:name=".StudentProvider" android:authorities="com.exmple.android_contentProvider.StudentProvider"/>

 

首先创建一个数据库,可见上一篇博客。

 然后实现内容提供者类实现ContentProvider接口,并实现其中的方法

 

public class StudentProvider extends ContentProvider {	
	private StudentDb dbhelp=null;  //声明创建数据库的SQLiteOpenHelper
	//创建一个路径适配对象,用于匹配访问应用给的访问路径,默认没有匹配
        private static final UriMatcher URI_MATCH=new UriMatch(UriMatcher.NO_MATCH);
	private static final int STUDENT=1;  //操作单条数据库记录
	private static final int STUDENTS=2;  //操作多条数据库记录
//定义匹配规则,#匹配任何数字,*匹配任何文字
    static{
    	URI_MATCH.addURI("com.exmple.android_contentProvider.StudentProvider/#", "student", STUDENT);
    	URI_MATCH.addURI("com.exmple.android_contentProvider.StudentProvider", "student", STUDENTS);
    }
	@Override
	public boolean onCreate() {
		dbhelp=new StudentDb(getContext()); //获取创建数据库的容器
		return false;
	}
    //查询数据
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Cursor cursor=null;
		int flag=URI_MATCH.match(uri); //匹配
		SQLiteDatabase database=dbhelp.getWritableDatabase();//获取数据库
		switch (flag) {
		case STUDENT:
			long id=ContentUris.parseId(uri); //获取记录的id值,
			String where_value=" id="+id;
			if(selection!=null&&!"".equals(selection)){
				where_value=where_value+" and "+selection;
			}
			cursor=database.query("student", null, where_value, selectionArgs, null, null, null);  //数据库执行查询语句返回一个游标
			break;
		case STUDENTS:  //查询多条记录
			cursor=database.query("student", null, selection, selectionArgs, null, null, null, null);
		default:
			break;
		}
		return cursor; //返回数据库的游标
	}
       //重写getType方法,处理uri头部信息
	@Override
	public String getType(Uri uri) {
		int flag=URI_MATCH.match(uri);
		switch (flag) {
		case STUDENT:
			return "vnd.android.cursor.item/student ";
		case STUDENTS:
			return "vnd.android.cursor.dir/student ";
		}
		return null;
	}
   //插入数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Uri resultUri=null;
		int flag=URI_MATCH.match(uri);
		switch (flag) {
		case STUDENTS:
			SQLiteDatabase database=dbhelp.getWritableDatabase();
			long id=database.insert("student",null, values);
			resultUri=ContentUris.withAppendedId(uri, id);
			break;
		default:
			break;
		}
		return resultUri;
	}
    //删除数据
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int count=-1;  //影响数据库的行数
		int flag=URI_MATCH.match(uri);  //匹配路径
		SQLiteDatabase database=dbhelp.getWritableDatabase();
		switch (flag) {
		case STUDENT:
			//通过客户端传过来id
			long id=ContentUris.parseId(uri);  
			String where_value=" id="+id;
			if(selection!=null&&!"".equals(selection)){
				where_value=where_value+" and "+selection;  //获取删除条件
			}
			count=database.delete("student", where_value, selectionArgs);
			break;
		case STUDENTS:
			count=database.delete("student",selection, selectionArgs);
			break;
		default:
			break;
		}
		return count;
	}
   //更新数据
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int count=-1;
		int flag=URI_MATCH.match(uri);  
		SQLiteDatabase database=dbhelp.getWritableDatabase();
		switch (flag) {
		case STUDENT:
			long id=ContentUris.parseId(uri);
			String where_value=" id="+id;
			if(selection!=null&&!"".equals(selection)){
				where_value=where_value+" and "+selection;   
			}
			count=database.update("student", values, where_value, selectionArgs);
			break;
		default:
			break;
		}
		return count;
	}
}

 内容解析者通过调用内容提供者的方法处理数据库,注意路径的规则:content://+权限

 

 

public class MyTest extends AndroidTestCase {
//向内容提供者数据库中插入数据
   public void insert(){
       //获取内容解析者
	   ContentResolver resolver=getContext().getContentResolver();
	   //content://+权限
	   Uri url=Uri.parse("content://com.exmple.android_contentProvider.StudentProvider/student");
	   ContentValues values=new ContentValues();
	   values.put("name","fangbing");
	   values.put("address", "hunan");
	   resolver.insert(url, values);
   }
}

 

 

  • 大小: 14.7 KB
分享到:
评论

相关推荐

    mars—第一季android——contentProvider

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的重要角色。本教程“mars—第一季android——contentProvider”聚焦于如何利用ContentProvider来实现不同应用程序之间的数据...

    android 来电拦截,手机黑名单的实现,涵盖Android四大组件,

    在这个项目中,我们将会深入探讨如何使用Android的四大组件——活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)以及内容提供者(ContentProvider)来创建一个来电拦截器,实现手机黑名单的功能...

    Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

    在Android应用开发中,"四大组件"是构成应用程序的核心元素,包括Activity(活动)、BroadcastReceiver(广播接收者)、ContentProvider(内容提供者)以及我们关注的Service(服务)。Service是Android系统中的一个...

    android 四大组件解析

    本文详细介绍了Android四大组件之一——Activity的核心概念及其使用方法。通过创建和配置Activity,开发者可以构建出具有丰富用户界面的应用程序。掌握Activity的启动、关闭以及数据传递机制对于实现流畅的用户体验...

    安卓四大组件——Service(服务)

    在Android开发中,四大组件是应用程序的核心组成部分,它们分别是Activity(活动)、BroadcastReceiver(广播接收器)、ContentProvider(内容提供者)以及我们今天重点关注的Service(服务)。Service组件在后台...

    Android四大核心——Intent

    在Android操作系统中,Intent是四大核心组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的重要桥梁,也是应用程序中启动活动、启动服务、传递数据的关键工具。本篇将深入探讨Intent的基本...

    Android中文翻译组——Android中文API合集(3).zip_android_手册

    1. **组件**:Android应用由四大组件构成:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。Activity是用户界面的入口,负责与用户交互;Service则在后台运行...

    android系统入门了解——main.rar

    3. **组件**:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)是Android四大组件,构成应用的基础。 二、开发环境搭建 1. **Android Studio**:Google官方...

    Android应用源码项目之——漂亮的平台书架.zip

    在本项目中,开发者将深入接触到Android的四大组件:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。 二、Java编程语言 Java是Android开发的主要语言,它是...

    Android发展简史-框架-四大组件-环境安装和配置-虚拟机——202100906.pdf

    Android四大组件: Android应用由四大基本组件构成:Activity、Service、BroadcastReceiver和ContentProvider。Activity是用户界面的体现,负责应用的界面显示和用户交互。Service是在后台运行长时间运行的操作,不...

    android各组件详解- Service

    Service是Android四大组件之一,其主要功能是在后台执行长时间运行的操作,而不与用户进行直接交互。这种组件非常适合于执行后台任务,如下载、上传数据、播放音乐、执行定时任务等。Service运行在应用程序进程的...

    android 4大组件

    总结一下,Android的四大组件——Activity、Service、BroadcastReceiver和ContentProvider是构建高效、稳定应用的基础。了解它们的工作原理和相互协作的方式,有助于提升开发效率和应用质量。同时,掌握布局设计和...

    安卓Android源码——应用开发揭秘源码.zip

    首先,Android应用开发的基础在于对Android SDK的理解,包括Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)以及Intent机制。源码中会展示这些组件的实现细节,例如Activity的生命周期...

    Android-AutoRegister:一种更高效的组件自动注册方案(android组件化开发)

    在Android系统中,四大组件——Activity、Service、BroadcastReceiver和ContentProvider,是构建应用程序的核心元素。每个组件都需要在AndroidManifest.xml文件中进行显式注册,以便系统可以发现并管理它们。然而,...

    安卓Android源码——NotePad便签.zip

    ContentProvider是Android四大组件之一,负责数据的共享和交换。NotePad中的ContentProvider实现了对笔记数据的增删查改接口,其他应用可以通过URI来访问这些数据。这有助于理解Android中数据的跨进程通信。 3. **...

    Android实现聊天机器人——课程设计报告,优秀课设聊天机器人_.doc

    4. **四大组件的应用**:掌握Activity、Service、BroadcastReceiver和ContentProvider的使用场景和编程技巧。 5. **网络编程**:学会使用HTTP请求和响应处理,掌握JSON数据解析方法。 6. **高级编程技术**:如多线程...

    Android开发——从小工到专家(书签)

    ContentProvider用于在不同应用间共享数据,是Android四大组件之一。掌握如何创建和使用ContentProvider,能够实现跨应用的数据交换。 八、碎片(Fragment) Fragment是用于构建可重用的UI模块,尤其在多屏幕适配中...

    安卓Android源码——高仿开心网.zip

    首先,源码中可能包含了Android四大组件的使用:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容提供者)。Activity是用户界面的基础,Service用于后台运行任务,...

    安卓Android源码——IncludeDemo.rar

    5. **Service、BroadcastReceiver和ContentProvider**:这三者是Android四大组件的其他三个,分别用于后台服务、广播接收和数据共享。 6. **视图(View)和布局(LayoutManager)**:Android UI主要基于View体系构建,...

    安卓Android源码——PixelTowers.zip

    Android应用主要由四大组件构成:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)。PixelTowers项目中的源码很可能包含了这些组件的实现,我们可以从中学习...

Global site tag (gtag.js) - Google Analytics