android contentResolver与contentProvider如何关联在一起的

合集下载

contentprovide例子(一)

contentprovide例子(一)

- ContentProvider示例一:联系人数据库在Android开发中,我们经常会需要访问设备的联系人信息。

这时就可以使用ContentProvider来提供联系人数据库的访问功能。

首先,我们需要在文件中声明READ_CONTACTS权限。

然后,我们可以通过ContentResolver类来获取联系人信息,实现对联系人数据库的访问。

我们可以通过以下步骤来实现对联系人数据库的访问:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如ContactsProvider。

在ContactsProvider中,我们需要重写query、insert、update和delete方法,这些方法分别对应了查询、插入、更新和删除操作。

2. 在query方法中,我们可以构建合适的SQL语句,然后通过ContentResolver的query方法来执行查询操作,从而获取联系人信息。

3. 在insert方法中,我们可以通过ContentResolver的insert方法来执行插入操作,向联系人数据库中添加新的联系人信息。

4. 在update方法中,我们可以通过ContentResolver的update方法来执行更新操作,更新联系人数据库中的联系人信息。

5. 在delete方法中,我们可以通过ContentResolver的delete方法来执行删除操作,从联系人数据库中删除指定的联系人信息。

用中获取、添加、更新和删除联系人信息。

- ContentProvider示例二:媒体文件访问除了联系人数据库之外,我们还可以使用ContentProvider来实现对媒体文件的访问。

例如,我们可以访问设备上的音乐文件、视频文件和图片文件。

通过ContentProvider,我们可以实现对媒体文件的查询、插入、更新和删除操作。

要实现对媒体文件的访问功能,我们可以按照以下步骤进行操作:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如MediaProvider。

简述contentprovider的工作原理

简述contentprovider的工作原理

简述contentprovider的工作原理ContentProvider是Android中的一个组件,用于为应用程序提供数据访问接口。

它可以将数据存储在内存中、文件系统中或数据库中,并提供CRUD(创建、读取、更新和删除)操作。

ContentProvider为应用程序提供了一种标准化的方式,通过它可以访问Android系统中的各种数据源,包括联系人、短信、图片等。

一、ContentProvider的基本概念1.1 ContentProvider的定义ContentProvider是Android系统中的一个组件,它提供了一种标准化的方式,通过它可以访问Android系统中的各种数据源,包括联系人、短信、图片等。

1.2 ContentProvider的特点(1)标准化:ContentProvider为应用程序提供了一种标准化的方式,通过它可以访问Android系统中的各种数据源。

(2)安全性:ContentProvider可以控制对数据源的访问权限,并且只有授权过的应用程序才能访问。

(3)线程安全性:ContentProvider是线程安全的,多个线程可以同时访问同一个ContentProvider对象。

(4)可扩展性:开发者可以自定义自己的ContentProvider,以满足不同应用程序对数据源不同需求。

二、ContentProvider工作原理2.1 ContentResolver与ContentProvider之间的关系在Android系统中,应用程序通过ContentResolver对象来访问ContentProvider提供的数据。

ContentResolver是Android系统中的一个组件,它提供了一种标准化的方式,通过它可以访问不同应用程序中的ContentProvider。

2.2 ContentProvider的URIContentProvider通过URI(统一资源标识符)来标识数据源。

内容提供者ContentProvider的使用详解

内容提供者ContentProvider的使用详解

内容提供者ContentProvider的使用详解1.什么是ContentProvider首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少。

ContentProvider为不同的软件之间数据共享,提供统一的接口。

也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件、数据库内存储的信息。

当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Android系统中,很多系统自带应用,比如联系人信息,图片库,音频库等应用,为了对其他应用暴露数据,所以就使用了ContentProvider机制。

所以,我们还是要学习ContentProvider的基本使用,在遇到获取联系人信息,图片库,音频库等需求的时候,才能更好的实现功能2.如何定义一个ContentProviderAndroid系统为了让我们更好的对外暴露数据,提供了统一的接口,所以定义了抽象类ContentProvider,因此,如果我们想对外提供数据,我们需要继承ContentProvider,并且实现下面的这几个方法:onCreate()当我们的provider初始化时被调用,我们应该在这个方法里面完成部分初始化操作query() 查询方法,用于给调用者返回数据insert() 插入操作,用于让外部应用插入数据到内容提供者中update() 更新操作,用于更新内容提供者的数据delete() 用于删除数据getType 返回内容提供者的MIME Type上面这些方法,当我们继承自ContentProvider的时候,eclipse 会自动的给我们添加,但是这并不代表我们每个方法都需要自定义实现。

如果我们只希望给其他应用提供数据,而不允许其他应用修改我们的数据,那么我们只需要实现onCreate(),getType()和query()这三个方法就可以了,其他的三个方法我们可以根据业务需求,实现或者是不实现。

4.1---Content Provider与ContentResolver 简介

4.1---Content Provider与ContentResolver 简介

如何调用系统的Content Provider一、ContentProvider简介我们说Android应用程序的四个核心组件是:Activity、Service、BroadcastReceiver和ContentProvider。

在Android中,应用程序彼此之间相互独立的,它们都运行在自己独立的虚拟机中。

ContentProvider提供了程序之间共享数据的方法,一个程序可以使用ContentProvider定义一个URI,提供统一的操作接口,其他程序可以通过此URI访问指定的数据,进行数据的增、删、改、查。

ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。

这就要求在AndroidManifest.XML中使用<provider>元素明确定义。

2. 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时候,需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似register,unregister的接口。

三、使用现成的ContentProvider下面我们就来看看代码,我们是怎么利用到现成的ContentProvider。

packageeoe.android.Demo;importandroid.app.Activity;importandroid.content.ContentResolver;importandroid.content.ContentValues;importandroid.database.Cursor;.Uri;importandroid.os.Bundle;importandroid.provider.ContactsContract;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;publicclassMainContentProviderextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);Buttonb1=(Button)findViewById(R.id.Button01);OnClickListenerocl=newOnClickListener(){@OverridepublicvoidonClick(Viewv){ContentResolvercontentResolver=getContentResolver();//获得所有的联系人Cursorcursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);//循环遍历if(cursor.moveToFirst()){intidColumn=cursor.getColumnIndex(ContactsContract.Contacts._ID);intdisplayNameColumn=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);do{//获得联系人的ID号StringcontactId=cursor.getString(idColumn);//获得联系人姓名StringdisPlayName=cursor.getString(displayNameColumn);Toast.makeText(MainContentProvider.this,"联系人姓名:"+disPlayName,Toast.LENGTH_LONG).show();//查看该联系人有多少个电话号码。

android面试题(二)

android面试题(二)

Android常用面试简答题1、android 中的动画有哪几类,它们的特点和区别是什么?参考答案:有两种,一种是Tween(补间)动画、还有一种是Frame(帧)动画。

Tween 动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame 动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

2、请简述Handler的机制原理参考答案:andriod 提供了Handler 和Looper 来满足线程间的通信。

Handler 先进先出原则。

Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。

1)Looper: 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue(消息队列)。

2)Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper从Message Queue 取出)所送来的消息。

3)Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UI thread 通常就是main thread,而Android 启动程序时会替它建立一个Message Queue。

3、说说mvc模式的原理,它在android中的运用参考答案:MVC 是Model,View,Controller 的缩写,从上图可以看出MVC 包含三个部分:模型(Model )对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。

视图(View )对象:是应用程序中负责生成用户界面的部分。

也是在整个MVC 架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。

控制器(Control )对象:是根据用户的输入,控制用户界面数据显示及更新Model 对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给M 哦得了处理。

Android数据共享之ContentProvider总结

Android数据共享之ContentProvider总结

Content Provider由上一节内容,我们了解到Adroid的数据都是私有的,那么对于像通讯录之类,多个APP(拨号、通话、短消息…)都需要共享使用,该怎么实现呢?答案就是ContentProvider。

概述:ContentProvider是Android平台中,在不同应用程序之间实现数据共享的一种机制。

一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。

并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。

Android为常用的数据类型(图片,音视频,通讯录)提供了大量的ContentProvider,它们被定义在android.provider包下面。

操作模型:ContentProvider类:定义在android.content包下面,主要数据存取类,提供了常用的数据操作接口•delete(): 删除数据集•insert():添加数据集•qurey():查询数据集•update():更新数据集•onCreate():初始化底层数据集和建立数据连接等工作•getType():返回指定URI的MIME数据类型,ContentResolver类:ContentProvider是实际操作数据库的方法,客户端通过ContentResolver实现,ContentResolver和ContentProvider提供了对应的方法,诸如insert(), delete(), query()和update()之类的方法。

我们间接的通过ContentResolver的方法来操作ContentProvider。

Uri介绍ContentProvider 通过URI对象共享数据;Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider2》对ContentProvider中的什么数据进行操作Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:A:无法改变的标准前缀,包括;"content://"、"tel://"等。

安卓考试知识点总结

安卓考试知识点总结

内容提供者内容提供者(ContentProvider )是Android 系统四大组件之一,用于保存和检索数据,是Android 系统中不同应用程序之间共享数据的接口。

ContentProvider 是不同应用程序之间进行数据交换的标准API ,以Uri 形式对外提供数据,允许其他应用操作本应用数据。

其他应用则使用ContentResolver ,并根据ContentProvider 提供的Uri 操作指定数据。

A 应用B应用使用ContentProvider暴露的数据ContentResolver通过ContentResolver操作A 应用数据操作暴露的数据返回操作结果返回操作结果数据模型Content Provider 使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录,每列代表特定类型和含义的数据。

例如,联系人的信息可能以如下方式提供:URI 的用法每个Content Provider 提供公共的URI (使用Uri 类包装)来唯一标识其数据集。

管理多个数据集(多个表格)的Content Provider 为每个都提供了单独的URI 。

所有为provider 提供的URI 都以“content://”作为前缀,“content://”模式表示数据由Content Provider 来管理。

A :标准前缀,用来说明一个Content Provider 控制这些数据,无法改变的;B :URI 的标识,它定义了是哪个Content Provider 提供这些数据。

对于第三方应用程序,为了保证URI 标识的唯一性,它必须是一个完整的、小写的 类名。

这个标识在<provider> 元素的 authorities 属性中说明:<provider name=”.TransportationProvider ” authorities=”com.example.transportationprovider ” . . . >C :路径,Content Provider 使用这些路径来确定当前需要生什么类型的数据,URI 中可能不包括路径,也可能包括多个;D :如果URI 中包含,表示需要获取的记录的ID ;如果没有ID ,就表示返回全部; 由于URI 通常比较长,而且有时候容易出错,切难以理解。

使用contentprovider 分享数据的步骤

使用contentprovider 分享数据的步骤

使用contentprovider 分享数据的步骤使用ContentProvider分享数据的步骤ContentProvider是Android中用于管理与其他应用程序共享数据的组件。

它提供了一种标准化的方式,让应用程序能够安全地发布和获取数据,而无需直接访问底层数据源。

以下是使用ContentProvider分享数据的一般步骤:1.设计数据结构和数据库模式:在开始使用ContentProvider之前,首先需要设计数据结构和确定数据库模式。

这包括确定数据表、字段以及数据表之间的关系。

在设计数据库时,应考虑到需要与其他应用程序共享的数据类型和关联。

2.创建ContentProvider类:创建一个类继承自Android提供的ContentProvider基类。

该类负责管理数据的发布和获取,它必须实现一组标准的CRUD(Create, Read, Update, Delete)方法,以便其他应用程序可以执行数据操作。

3.定义URI:URI(Uniform Resource Identifier)用于标识要操作的数据资源。

在ContentProvider中,URI通常由以下几个部分组成:authority、path和optional ID。

authority是ContentProvider的唯一标识符,path用于指定资源的类型,optional ID是可选的资源ID。

根据具体需求,可以定义多个URI 以满足不同的操作。

4.实现CRUD方法:根据设计的数据结构和数据库模式,实现ContentProvider 中的CRUD方法。

这些方法包括insert、query、update和delete,分别对应数据的插入、查询、更新和删除操作。

可以根据不同的URI来处理不同的数据操作。

5.注册ContentProvider:在AndroidManifest.xml文件中注册ContentProvider。

在<application>标签下添加<provider>标签,并设置ContentProvider的authority属性以及其他属性,如读写权限等。

ContentProvider与ContentResolver使用

ContentProvider与ContentResolver使用

ContentProvider与ContentResolver使用1.什么是ContentProviderContentResolver是数据调用者,ContentProvider将数据发布出来后通过ContentResolver对象结合Uri进行调用。

通过ContentResolver可以调用ContentProvider的增、删、改、查操作。

122.什么是Uri?上面使用ContentResolver需要结合Uri进行调用,那么什么是Uri:通用资源标识符简称URI;Uri代表操作数据的地址,每个ContentProvider发布数据都有一个唯一的地址;Uri格式:content://com.android.app/contacts12343.创建自定义ContentProvide的步骤1.使用SQLine,创建数据库和数据表;2.新建类继承ContentProvider;3.创建UriMatcher定义Uri的规则;4.重写ContentProvider的6个方法;5.在Manifest中注册Provider;6.ContentResolver对ContentProvider共享数据进行操作;1234564.自定义ContentProvider简易例子:首先在一个项目中完成好数据库表的创建;新建一个类继承ContentProvider;并重写ContentProvider的6个方法;在方法中实现数据库增、删、改、查的操作;1234public class Myprovider extends ContentProvider {@Override//重写onCreate方法public boolean onCreate() {dbHelpter = new DBHelpter(getContext(), "demodb", null, 1);Log.e("0000000000","onCreate");return false;}@Nullable@Override//重写query方法、实现查询操作。

contentprovide用法

contentprovide用法

contentprovide用法ContentProvide是Android平台上的一个组件,用于为应用程序提供数据访问的能力。

在本文中,将逐步回答关于ContentProvide的使用方法。

第一步:了解ContentProvider的基本概念和作用ContentProvider是Android中提供数据访问的组件之一,它允许应用程序共享和访问数据,从而实现多个应用程序之间的数据共享。

ContentProvider提供了一种标准化的方式来访问和管理数据,使得应用程序可以通过URI(Uniform Resource Identifier)来查询、插入、更新和删除数据。

第二步:创建一个ContentProvider类要使用ContentProvider,首先需要创建一个继承自android.content.ContentProvider类的自定义ContentProvider类。

这个类负责处理数据的访问请求,并提供数据给其他应用程序。

第三步:实现ContentProvider的必要方法自定义ContentProvider类需要实现以下几个重要的方法:- onCreate():在ContentProvider被创建时调用,用于初始化一些资源和数据库的连接。

- query():用于处理查询数据库的请求,并返回查询结果。

- insert():用于处理向数据库中插入数据的请求,并返回插入的URI。

- update():用于处理更新数据库的请求,并返回更新的行数。

- delete():用于处理删除数据库记录的请求,并返回删除的行数。

- getType():根据URI返回相应的数据类型。

第四步:在AndroidManifest.xml文件中注册ContentProvider在使用ContentProvider之前,需要在AndroidManifest.xml文件中对其进行注册。

使用<provider>元素进行注册,指定自定义ContentProvider类的名称、权限和数据访问URI。

Android基础面试常见知识点汇集(干货)

Android基础面试常见知识点汇集(干货)

Android基础面试常见知识点汇集(干货)1、四大组件是什么1)Activity:用户可操作的可视化界面,为用户提供一个完成操作指令的窗口。

一个Activity 通常是一个单独的屏幕,Activity通过Intent来进行通信。

Android中会维持一个Activity Stack,当一个新Activity创建时,它就会放到栈顶,这个Activity就处于运行状态。

2)Service:服务,运行在手机后台,适合执行不需和用户交互且还需长期运行的任务。

3)ContentProvider:内容提供者,使一个应用程序的指定数据集提供给其他应用程序,其他应用可通过ContentResolver类从该内容提供者中获取或存入数据。

它提供了一种跨进程数据共享的方式,当数据被修改后,ContentResolver接口的notifyChange函数通知那些注册监控特定URI的ContentObserver对象。

如果ContentProvider和调用者在同一进程中,ContentProvider的方法(query/insert/update/delete等)和调用者在同一线程中;如果ContentProvider和调用者不在同一进程,ContentProvider方法会运行在它自身进程的一个Binder线程中。

4)Broadcast Receiver: 广播接收者,运用在应用程序间传输信息,可以使用广播接收器来让应用对一个外部事件做出响应。

2、四大组件的生命周期和简单用法1)Activity:onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()onCreate():为Activity设置布局,此时界面还不可见;onStart(): Activity可见但还不能与用户交互,不能获得焦点onRestart(): 重新启动Activity时被回调onResume(): Activity可见且可与用户进行交互onPause(): 当前Activity暂停,不可与用户交互,但还可见。

contentprovider例子

contentprovider例子

contentprovider例子什么是ContentProvider?ContentProvider是Android中的一个组件,用于对外提供数据访问接口。

它可以帮助应用程序之间共享数据,以及让应用程序可以访问其他应用程序的数据。

通过ContentProvider,应用程序可以提供数据给其他应用程序使用,也可以获取其他应用程序的数据。

在Android中,应用程序间的数据共享是一个很常见的需求。

例如,一个音乐播放器想要访问另一个应用程序中存储的音乐文件,或者一个备忘录应用程序希望能够获取日历应用程序中的事件数据。

这时,使用ContentProvider就可以实现数据共享和数据访问。

如何创建一个ContentProvider?创建一个ContentProvider需要按照以下步骤进行:1. 创建一个类,继承自Android提供的ContentProvider基类。

这个基类提供了一些默认的实现方法,需要进行重写才能实现具体的数据访问逻辑。

2. 在AndroidManifest.xml中注册ContentProvider。

在<application>标签内部添加一个<provider>标签,指定ContentProvider的相关信息,例如authority、路径等。

3. 实现ContentProvider的抽象方法。

这些方法包括query、insert、update和delete等,用于处理外部应用程序对数据的查询、插入、更新和删除等操作。

4. 实现ContentProvider的其他方法。

这些方法包括getType、openFile、delete等,用于处理获取数据类型、打开文件和删除数据等操作。

如何使用ContentProvider进行数据访问?通过ContentResolver类可以实现对ContentProvider的访问。

ContentResolver是系统级别的API,用于协调应用程序与ContentProvider之间的交互。

一起学Android之ContentProvider

一起学Android之ContentProvider

一起学Android之ContentProvider本文主要讲解在Android开发中ContentProvider的常规用法,仅供学习分享使用,如有不足之处,还请指正。

访问一个ContentProvider在Android开发中,应用程序通过ContentResolver(内容解析器)从ContentProvider(内容提供者)中获取数据,ContentResolver提供访问ContentProvider中同名方法,ContentProvider包括ContentProvider和它的子类,ContentResolver对ContentProvider的持久层存储提供了基本的CRUD (Create,Retrieve,Update,Delete)方法进行访问。

客户端App的ContentResolver对象自动处理和ContentProvider的App之间的进程间通信。

ContentProvider还充当数据库和外部数据视图表现之间的抽象层。

备注:如果要访问一个ContentProvider,App需要在清单文件中请求对应的权限。

例如:从User Dictionary Provider中获取单词和区域的列表,可以调用ContentResolver.query()方法,如下图所示:1 // 查询用户定义字典并返回结果2 mCursor = getContentResolver().query(3 UserDictionary.Words.CONTENT_URI, // 单词表的内容URI4 mProjection, // 查询的数据列名数组5 mSelectionClause //查询条件,可以为null6 mSelectionArgs, // 查询参数,可以为null7 mSortOrder); // 返回数据对象的排序条件下表显示了query(Uri,projection,selection,selectionArgs,sortOrder) 如何与SQL语句进行匹配:Content URIsContent URI是Provider中标识数据的URI,包括整个Provider (其权限)的符号名和指向表(或路径)的名称,Content URI是访问ContentProvider的参数之一。

Android中ContentProvider和ContentResolver详解

Android中ContentProvider和ContentResolver详解

Android中ContentProvider和ContentResolver详解Android中ContentProvider和ContentResolver详解在Android中,我们的应⽤有的时候需要对外提供数据接⼝,可以有如下⼏种⽅法:1)AIDL 2)Broadcast 3)ContentProvider。

使⽤AIDL需要我们编写AIDL接⼝以及实现,⽽且对⽅也要有相应的接⼝描述,有点⿇烦;使⽤Broadcast,我们不需要任何接⼝描述,只要协议⽂档就可以了,但是有点不好就是,这种⽅式不直接⽽且是异步的;使⽤ContentProvider我们不需要接⼝描述,只需要知道协议,同时这种⽅式是同步的,使⽤⽅便。

下⾯是ContentProvider实现:package com.backgroundservice;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import .Uri;import android.util.Log;/*** TODO** @author zengpeng* @version 1.0 Create At : 2010-3-18 下午02:52:40*/public class TestContentProvider extends ContentProvider {private SQLiteDatabase mDb;private DatabaseHelper mDbHelper = null;private static final String DATABASE_NAME = "rssitems.db";private static final String DATABASE_TABLE_NAME = "rssItems";private static final int DB_VERSION = 1;private static final int ALL_MESSAGES = 1;private static final int SPECIFIC_MESSAGE = 2;// Set up our URL matchers to help us determine what an// incoming URI parameter is.private static final UriMatcher URI_MATCHER;static {URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);URI_MATCHER.addURI("test", "item", ALL_MESSAGES);URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);}// Here's the public URI used to query for RSS items.public static final Uri CONTENT_URI = Uri.parse("content://test/item");// Here are our column name constants, used to query for field values.public static final String ID = "_id";public static final String NAME = "NAME";public static final String VALUE = "VALUE";public static final String DEFAULT_SORT_ORDER = ID + " DESC";private static class DatabaseHelper extends AbstractDatabaseHelper {@Overrideprotected String[] createDBTables() {// TODO Auto-generated method stubString sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"+ VALUE + " TEXT);";return new String[] { sql };}@Overrideprotected String[] dropDBTables() {// TODO Auto-generated method stubreturn null;}@Overrideprotected String getDatabaseName() {// TODO Auto-generated method stubreturn DATABASE_NAME;}@Overrideprotected int getDatabaseVersion() {// TODO Auto-generated method stubreturn DB_VERSION;}@Overrideprotected String getTag() {// TODO Auto-generated method stubreturn TestContentProvider.class.getSimpleName(); }}/****/public TestContentProvider() {// TODO Auto-generated constructor stub}/** (non-Javadoc)** @see android.content.ContentProvider#delete(.Uri,* ng.String, ng.String[])*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// NOTE Argument checking code omitted. Check your parameters!int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs); // Notify any listeners and return the deleted row count.getContext().getContentResolver().notifyChange(uri, null);return rowCount;}/** (non-Javadoc)** @see android.content.ContentProvider#getType(.Uri)*/@Overridepublic String getType(Uri uri) {switch (URI_MATCHER.match(uri)) {case ALL_MESSAGES:return "vnd.android.cursor.dir/rssitem"; // List of items.case SPECIFIC_MESSAGE:return "vnd.android.cursor.item/rssitem"; // Specific item.default:return null;}}/** (non-Javadoc)** @see android.content.ContentProvider#insert(.Uri,* android.content.ContentValues)*/@Overridepublic Uri insert(Uri uri, ContentValues values) {// NOTE Argument checking code omitted. Check your parameters! Check that// your row addition request succeeded!long rowId = -1;rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri); // Notify any listeners and return the URI of the new row.getContext().getContentResolver().notifyChange(CONTENT_URI, null); return newUri;}/** (non-Javadoc)** @see android.content.ContentProvider#onCreate()*/@Overridepublic boolean onCreate() {// TODO Auto-generated method stubtry{mDbHelper = new DatabaseHelper();mDbHelper.open(getContext());mDb = mDbHelper.getMDb();}catch(Exception e){e.printStackTrace();}return true;}/** (non-Javadoc)** @see android.content.ContentProvider#query(.Uri,* ng.String[], ng.String, ng.String[],* ng.String)*/public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// We won't bother checking the validity of params here, but you should! // SQLiteQueryBuilder is the helper class that creates the// proper SQL syntax for us.SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();// Set the table we're querying.qBuilder.setTables(DATABASE_TABLE_NAME);// If the query ends in a specific record number, we're// being asked for a specific record, so set the// WHERE clause in our query.if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){qBuilder.appendWhere("_id=" + uri.getLastPathSegment());Log.i("TestContentProvider", "_id=" + uri.getLastPathSegment());}// Make the query.Cursor c = qBuilder.query(mDb,projection,selection,selectionArgs,null,null,sortOrder);Log.i("TestContentProvider", "get records");c.setNotificationUri(getContext().getContentResolver(), uri);return c;}/** (non-Javadoc)** @see android.content.ContentProvider#update(.Uri,* android.content.ContentValues, ng.String, ng.String[])*/@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// NOTE Argument checking code omitted. Check your parameters!int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);// Notify any listeners and return the updated row count.getContext().getContentResolver().notifyChange(uri, null);return updateCount;}}配⽂件如下:<provider android:name="TestContentProvider"android:authorities="test"></provider>在客户端中可以使⽤如下⽅法进⾏调⽤:ContentValues values = new ContentValues();values.put(, "testname1");values.put(TestContentProvider.VALUE, "testvalu1e");Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values);Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{}, null, null, null);Log.i("TestActivity", "" + c.getCount());if(c.moveToNext()){Log.i("TestActivity", c.getString(0));}上⾯的代码是先进⾏插⼊,然后进⾏查询并打印。

Observer模式在Android中的应用

Observer模式在Android中的应用

Observer模式在Android中的应用Observer模式是一种设计模式,用来在对象之间建立一些松散的耦合关系。

这种模式的核心思想是,某些对象(称为观察者)将能够自动地被通知到,当另一些对象(称为主题)发生一些改变时。

在Android应用程序中,Observer模式常常被用来监听数据的变化并更新UI。

在数据交互的过程中,我们常常需要对数据进行响应式的更新,以及在数据发生变化的时候,要自动地通知监听者,Observer模式可以很好地解决这些问题。

在Android中,Android自带的Observer类是个很好的例子,它提供了一种监听数据变化的机制。

Observer类位于android.database包下,它是Android系统提供的观察者模式的实现,通过对ContentProvider进行监听,实现数据的自动刷新。

我们可以使用ContentResolver来操作ContentProvider,同时也可以通过注册ContentObserver来监听ContentProvider的变化。

下面,我们来详细了解一下Observer在Android中的应用。

一、ContentProviderContentProvider是Android四大组件之一,它提供了一种结构化的访问数据的方式。

如果我们需要向其他应用程序公开自己应用程序的数据,或访问其他应用程序的数据,就需要通过ContentProvider进行操作。

ContentProvider主要有三个方法:- query:查询数据并返回Cursor对象- insert:插入新的数据并返回新数据的Uri- update:更新数据并返回更新的行数在Android中,ContentProvider是线程安全的。

这意味着多个线程可以同时操作ContentProvider,而不会出现数据混乱的情况。

二、ContentResolverContentResolver是Android提供的一种访问ContentProvider的方式,我们可以通过ContentResolver对ContentProvider进行操作。

contentprovider和contentredolver的实例 -回复

contentprovider和contentredolver的实例 -回复

contentprovider和contentredolver的实例-回复ContentProvider和ContentResolver是Android中用于实现数据共享和数据访问的重要组件。

ContentProvider提供数据,并且支持对数据的增加、删除、修改和查询操作,而ContentResolver则负责对数据进行访问和操作。

本文将一步一步详细介绍ContentProvider和ContentResolver的使用方法和实例。

一、ContentProvider的使用方法和实例1. 创建ContentProvider要创建一个ContentProvider,需要继承ContentProvider类,并实现以下几个重要方法:onCreate、query、insert、update和delete。

下面是一个简单的示例:javapublic class MyContentProvider extends ContentProvider { private static final String AUTHORITY ="com.example.mycontentprovider";private static final Uri CONTENT_URI = Uri.parse("content:" + AUTHORITY + "/person");在此进行一些初始化操作@Overridepublic boolean onCreate() {return true;}查询数据@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {执行查询操作,返回Cursor}插入数据@Overridepublic Uri insert(Uri uri, ContentValues values) {执行插入操作,返回新插入数据的Uri}更新数据@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {执行更新操作,返回受影响的行数}删除数据@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {执行删除操作,返回受影响的行数}返回ContentProvider的MIME类型@Overridepublic String getType(Uri uri) {根据传入的Uri返回对应的MIME类型}}2. 注册ContentProvider在AndroidManifest.xml文件中注册ContentProvider,需要指定authority和path属性,示例如下:xml<providerandroid:name=".MyContentProvider"android:authorities="com.example.mycontentprovider"android:exported="true"android:readPermission="com.example.permission.READ"android:writePermission="com.example.permission.WRITE"> </provider>3. 使用ContentProvider使用ContentProvider的关键是借助ContentResolver类。

contentresolver 的call 方法 -回复

contentresolver 的call 方法 -回复

contentresolver 的call 方法-回复什么是contentresolver 的call 方法?在Android 系统中,ContentResolver 是一个用于与ContentProvider 进行交互的类。

ContentProvider 提供了对应用程序所拥有的数据的标准界面,通过ContentResolver 类,应用程序可以实现对这些数据的增删改查操作。

ContentResolver 提供了多个方法来执行这些操作,其中包括call 方法。

ContentResolver 的call 方法允许应用程序通过对ContentProvider 发送自定义操作来实现更高级的功能。

通过调用call 方法并传递相应的参数,应用程序可以发送一个名为"call" 的特殊操作到ContentProvider 中,ContentProvider 可以根据这个操作名做出相应的处理,并返回一个Bundle 对象作为响应。

下面将逐步介绍contentresolver 的call 方法的使用步骤和常见应用场景。

第一步:获取ContentResolver 实例要使用ContentResolver 的call 方法,首先需要获取ContentResolver 实例。

可以通过调用context 的getContentResolver() 方法来获取:javaContentResolver resolver = context.getContentResolver();第二步:构建call 方法所需的参数ContentProvider 可能对应用程序传递的不同操作名具有不同的处理逻辑,因此在调用call 方法之前,需要构建相应的参数。

通常,参数以键值对的形式传递,并封装在一个Bundle 对象中。

javaBundle args = new Bundle();args.putString("key1", "value1");args.putInt("key2", 2);添加更多的参数在上述示例中,我们使用了两个键值对参数,一个是字符串类型的"key1",值为"value1",一个是整型的"key2",值为2。

contentresolver 的call 方法

contentresolver 的call 方法

contentresolver 的call 方法简介在Android开发中,ContentResolver是一个重要的类,用于与ContentProvider进行交互。

ContentProvider提供了一种统一的方式来访问和共享数据,而ContentResolver则是应用程序与ContentProvider之间的桥梁。

ContentResolver提供了多种方法来操作ContentProvider中的数据,其中之一就是call方法。

本文将详细介绍contentresolver的call方法。

ContentResolver的基本概念在Android中,ContentResolver是一个全局的应用程序类,用于访问和操作ContentProvider提供的数据。

ContentProvider是一种组件,用于对外提供数据,并且可以跨进程共享数据。

ContentResolver通过URI来识别ContentProvider,并且提供了丰富的方法来操作数据,如查询、插入、更新和删除等。

ContentResolver的call方法ContentResolver的call方法用于向ContentProvider发送一个自定义的请求,并获取返回结果。

call方法的定义如下:public Bundle call(Uri uri, String method, String arg, Bundle extras)参数说明: - uri:ContentProvider的URI,用于标识要操作的数据。

- method:自定义的方法名,用于标识要执行的操作。

- arg:方法的参数,可以为空。

- extras:附加的参数,可以为空。

返回值:返回一个Bundle对象,用于存储返回的数据。

使用ContentResolver的call方法使用ContentResolver的call方法需要按照以下步骤进行操作:1.获取ContentResolver对象:ContentResolver resolver = getContentResolver();2.构建要操作的URI:Uri uri = Uri.parse("content://com.example.provider/user");3.调用call方法:Bundle result = resolver.call(uri, "customMethod", "arg", null);4.处理返回结果:String resultData = result.getString("result");ContentProvider中的实现在ContentProvider中,需要重写call方法来处理来自ContentResolver的请求。

contentresolver notifychange 传参数

contentresolver notifychange 传参数

contentresolver notifychange 传参数ContentResolver的notifyChange()方法是Android平台中一个非常有用的方法,用于通知ContentProvider数据发生了变化。

这个方法允许我们在数据更新后,及时通知其他相关组件做出相应的改变。

本文将详细介绍ContentResolver的notifyChange()方法,并解释传参的方式及其使用。

首先,我们需要了解ContentResolver和ContentProvider之间的关系。

ContentResolver是一个用于访问ContentProvider的类,它充当了客户端和ContentProvider之间的中间人。

ContentProvider则提供数据的增删改查操作。

当我们对ContentProvider中的数据进行了修改后,我们需要通过ContentResolver的notifyChange()方法来通知其他组件相关数据的变化,以便及时刷新展示或做出其他操作。

在使用notifyChange()方法时,我们可以传入两个参数:uri和observer。

uri是用于指定变化的数据的地址,而observer是一个观察者对象,用于接收数据变化的通知。

我们可以通过注册一个ContentObserver来实现观察者模式,从而及时得到通知。

在具体使用时,我们可以通过以下方式传递uri参数:1. 传递整个表的uri:我们可以使用ContentProvider的getContentUri()方法来获取一个表的uri,然后传递给notifyChange()方法。

这样,当该表中的任何数据发生变化时,都会触发通知。

2. 传递特定数据行的uri:我们可以通过ContentUris的withAppendedId()方法,将一个特定的id与表的uri结合起来获取特定数据行的uri。

这样,当指定id的数据行发生变化时,就会触发通知。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android contentResolver与contentProvider如何关联在一起的看到一篇文章觉得不错,推荐给大家,希望大家喜欢Application是一个完整的应用,比如某个apk,它对应一个Application,它里面可能包含n个Activity。

涉及到的类froyo/frameworks/base/core/java/android/app/ApplicationC ontext.javafroyo/frameworks/base/core/java/android/app/ActivityThre ad.javafroyo/frameworks/base/services/java/com/android/server/a m/ActivityManagerService.java当我们启动手机之后,如果需要启动一个activity,ActivityThread,ActivityManagerService就开始发挥作用了,这里不做细述。

当我们真正的启动一个activity的时候,我们会把当前Application的ApplicationContext传进去,ApplicationContext实例持有一个mContextResolver对象,该对象对应于ApplicationContext的内部类ApplicationContentResolver.当activity调用getContentResolver()时,我们实际调用的是当前ApplicationContext中的mContextResolver. 由于黑色的继承关系,我们可以得到红色的调用关系代码片段如下:Activity调用ContextWrapper的方法getContentResolver(){ mBase.getContentResolver(); }复制代码然后会调用到ApplicationContext的方法getContentResolver() { return mContentResolver; }复制代码其中:mContentResolve r = new ApplicationContentResolver(this, mainThread); private static final class ApplicationContentResolver extends ContentResolver {public ApplicationContentResolver(Context context,ActivityThread mainThread){super(context);mMainThread = mainThread;} @Overrideprotected IContentProvideracquireProvider(Context context, String name){return mMainThread.acquireProvider (context, name);} @Overridepublic boolean releaseProvider(IContentProvider provider){returnmMainThread.releaseProvider(provider);}private final ActivityThread mMainThread;}复制代码当执行mContentResolver.query()的时候,我们会调用父类ContentResolver的query();public final Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder) {IContentProvider provider = acquireProvider(uri);if (provider == null) {return null;}try {Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder);if(qCursor == null) {releaseProvider(provider);return null;}//Wrap the cursor object intoCursorWrapperInner objectreturn new CursorWrapperInner(qCursor, provider);} catch (RemoteException e) {releaseProvider(provider);return null;} catch(RuntimeException e) {releaseProvider(provider);throw e;}}public final IContentProvider acquireProvider(Uri uri){if(!SCHEME_CONTENT.equals(uri.getScheme())) {return null;}String auth = uri.getAuthority();if (auth != null) {return acquireProvider(mContext, uri.getAuthority());}return null;}复制代码此时,会调用子类实例aquireProvider(Context,name);mMainThread.acquireProvi der (context, name);复制代码实现为:public final IContentProvider acquireProvider (Context c, String name) {IContentProvider provider = getProvider (c, name);if(provider == null)return null;IBinder jBinder = provider.asBinder(); //获得binder对象,跨进程传递数据。

synchronized(mProviderMap) {ProviderRefCount prc = mProviderRefCountMap.get(jBinder);if(prc == null) {mProviderRefCountMap.put(jBinder, new ProviderRefCount(1));} else {prc.count++;} //end else} //end synchronizedreturn provider;}private final IContentProvider getProvider (Context context, String name) {synchronized(mProviderMap) {final ProviderRecord pr =mProviderMap .get(name); //ActivityThread中持有所有的Provider的实例if (pr != null) {return pr.mProvider;}}//如果确实没有,则查找,并install,再没有就直接抛异常了。

IActivityManager.ContentProviderHolder holder = null;try {holder =ActivityManagerNative.getDefault().getContentProvider(getApplicationThread(), name);} catch (RemoteException ex) {}if (holder == null) {Log.e(TAG, "Failed to find provider info for " + name);return null;}if (holder.permissionFailure != null) {throw new SecurityException("Permission " + holder.permissionFailure+ " required for provider " + name);} IContentProvider prov = installProvider(context, holder.provider,, true);//Log.i(TAG, "noReleaseNeeded=" +holder.noReleaseNeeded);if (holder.noReleaseNeeded || holder.provider == null) {// We are not going to release the provider if it is an external// provider that doesn't care about being released, or if it is// a local provider running in this process.//Log.i(TAG, "*** NO RELEASE NEEDED");synchronized(mProviderMap) {mProviderRefCountMap.put(prov.asBinder(), new ProviderRefCount(10000));}}return prov;}复制代码到这里的话,ContentResovler与ContentProvider的关系就搞懂了,具体其他的细节,将分为不同的方面,分别讲述。

相关文档
最新文档