ContentProvider使用详解
《Android移动应用开发》访问系统ContentProvider
参数说明 uri 用于查询ContentProvider的Uri。 projection 用于标识 uri 中有哪些列需要包含在返回的 Cursor 对象中。 selection 作为查询的过滤参数,类似于 SQL 中 Where 语句之后的条件选择。 selectionArgs 查询条件参数,配合 selection 参数使用。 sortOrder 查询结果的排序方式。
2 使用ContentProvider
访问系统ContentProvider
方法
Activity中调用getContentResolver()获取ContentResolver对象 ContentResolver对象具有调用ContentProvider 中同名方法的方法,可提供持续存储的基本 “CRUD”(创建、检索、更新和删除)功能。
Content Resolver
Data
SQLite
XML
Remote Store
1 认识ContentProvider
系统ContentProvider
多媒体提供者 日历提供者 联系人提供者 文档提供者
2 使用ContentProvider
访问系统ContentProvider
基本步骤
1)为应用程序添加ContentProvider的访问权限。 2)通过getContentResolver()方法得到ContentResolver对象。 3)调用ContentResolver类的query()方法查询数据,该方法会返回一个Cursor对象。 4)对得到的Cursor对象进行分析,得到需要的数据。 5)调用Cursor类的close()方法将Cursor对象关闭。
【推荐下载】Android中ContentProvider的意义及用法
Android 中ContentProvider 的意义及用法ContentProvider 提供了标准的接口,供APP 跟其他APP 共享数据。
ContentProvider 提供了一种基于使用content://模式的简单URI 寻址模型来发布和使用数据的接口。
它允许将应用层跟底层数据层分离,通过抽象底层数据源使应用程序不必依赖于某个数据源。
1、示例展示用法1) MyContentProvider.java/** * 抽象类,实现了ComponentCallbacks2 接口* p 在清单文件注册,进程启动时自动创建。
/p public class MyContentProvider extends ContentProvider { private static final String TAG = MyContentProvider.class.getSimpleName(); public static final Uri CONTENT_URI =Uri.parse(“content://com.qinuli.provider.mycontentprovider/elements”); private static final int ALL_ROWS = 1; private static final int SINGLE_ROW = 2; private static final UriMatcher URI_MATCHER; static{ URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);URI_MATCHER.addURI(“com.qinuli.provider.mycontentprovider”,“elements”, ALL_ROWS); URI_MATCHER.addURI(“com.qinuli.provider.mycontentprovider”,“elements/#”,SINGLE_ROW); private MyDB myDB; @Override public boolean onCreate() { Log.d(TAG, “onCreate”);myDB = new MyDB(getContext(), MyDB.DATABASE_NAME, null, MyDB.DATABASE_VERSION); return true;@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = myDB.getWritableDatabase(); SQLiteQueryBuilder sqLiteQueryBuilder = new SQLiteQueryBuilder(); sqLiteQueryBuilder.setTables(MyDB.DATABASE_TABLE);switch(URI_MATCHER.match(uri)){ case SINGLE_ROW: String rowID =。
内容提供者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()这三个方法就可以了,其他的三个方法我们可以根据业务需求,实现或者是不实现。
Content Provider使用
columns, // 要返回的数据字段
null,
// WHERE子句
null, // WHERE 子句的参数
null // Order-by子句
);
if (cur.moveToFirst()) {
String name = null;
String phoneNo = null;
3. 创建你的数据存储系统。大多数Content Provider使用Android文件系 统或SQLite数据库来保持数据,但是你也可以以任何你想要的方式来存 储。
4. 定义你要返回给客户端的数据列名。如果你正在使用Android数据 库,则数据列的使用方式就和你以往所熟悉的其他数据库一样。但是, 你必须为其定义一个叫_id的列,它用来表示每条记录的唯一性。
录的MIME类型)
比如,
一个请求列车信息的URI如
content://com.example.transportationprovider/trains/122 可能就会返回
typevnd.android.cursor.item/vnd.example.rail这样一个MIME类型。
vnd.android.cursor.dir/vnd.yourcompanyname.contenttype (多个记录
删除记录: Content Provider中的getContextResolver.delete()方法可以用来删除记 录,下面的记录用来删除设备上所有的联系人信息:
private void deleteRecords() { Uri uri = People.CONTENT_URI;
getContentResolver().delete(uri, null, null); } 你也可以指定WHERE条件语句来删除特定的记录: getContentResolver().delete(uri, “NAME=” + “‘XYZ XYZ’”, null); 这将会删除name为‘XYZ XYZ’的记录。
ContentProvider详解
ContentProvider详解⼏个概念:Cursor、 Content provider 、 Uri 、contentresolver1、Cursor :个⼈理解为数据库中的⼀⾏数据,它是每⾏数据的集合。
它是⼀个类。
通过它的⼀系列⽅法,我们可以对数据库中的每⾏进⾏定位,我们还可以知道每⼀列的信息。
⽐如:cursor(游标).moveToFirst(),表⽰定位到第⼀⾏,然后我们通过其他⽅法可以知道每列的名称,每列的数据类型等。
2、Content Provider :内容提供者,我们⼀个application中的其他类假如想操作数据库中的数据的话,就可以直接对此进⾏操作,⽽避免了对数据库进⾏直接操作,再说了,数据库这些个东西有权限要求的,我们不可能把数据库直接暴露出来,所以,通常采⽤这种形式。
其实他就是⼀个提供数据访问的⽹站,我们要访问它的话,就得知道他的域名。
android:authorities . 在minifest.xml中配置如下:(包含两个部分,name 与 anthorities)<provider android:name=".PersonProvider" android:authorities="com.sharpandroid.providers.personprovider"/>当某个应⽤,可能是外部的,可以通过这两个属性来找到这个Content Provider了。
Content Provider ⽀持在多个应⽤中存储和读取数据。
这也是跨应⽤共享数据的唯⼀⽅式。
在android系统中,没有⼀个公共的内存区域,供多个应⽤共享存储数据。
3、Uri:这个东西就是提供者提供数据的详细地址,到底是哪些数据,⽤此来对数据进⾏过滤操作。
假如说,Content Provider是⼀个DNS,域名的话。
那么Uri可以认为是IP地址,我们通过此IP地址找到我们所需要的数据。
Android四大组件 之ContentProvider
获得系统的CP 的数据
• Android系统中会给应用提供一些开放的系统数据,当然 它是采用CP的这种形式。 • 通过ContentResolver访问系统CP的步骤: – 调用Activity的ContentResolver获取CR对象 – 调用CR中的insert,delete,update,query方法获得系 统CP提供的数据
URI
例如以下是系统的一些 URI: content://media/internal/images (该 URI 返回设备上存储的所有图片)
content://contacts/people/5 (联系人信息中 ID 为 5 的联系人记录)
content://contacts/people (该 URI 返回设备上的所有联系人信息)
• 注意:
– 要获得系统CP提供的数据,必须要了解该CP的Uri。
使用CP 管理联系人
• Android系统中Contacts应用来管理联系人,而且暴露相 应CP。 • 此CP支持的Uri如下: – ContactsContract.Contacts.CONTENT_URI :管理联系 人的Uri – monDataKinds.Phone.CONTENT_ URI:管理联系人的电话的Uri – monDataKinds.Email.CONTENT_ URI:管理联系人的Email的Uri
2)、parseId(uri)//用于从指定uri中解析出所包含的id的值
Uri uri = Uri.parse("content://com.yfz.Lesson/people/10") long personid = ContentUris.parseId(uri); 最后personid 为 :10
使用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使用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是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 content provider 的用法
android content provider 的用法Android Content Provider是一种用于数据共享和跨应用访问的组件,它允许应用程序将数据存储在一个中央存储库中,并且其他应用程序可以通过Content Provider来访问和操作这些数据。
Content Provider是Android四大组件之一。
下面是使用Android Content Provider的一般步骤:1. 创建Content Provider类:创建一个类来扩展android.content.ContentProvider,并实现其中的抽象方法。
2. 定义URI和数据表:为Content Provider定义数据表和对应的URI,URI用于唯一标识Content Provider中的数据集。
3. 初始化Content Provider:在Content Provider的onCreate()方法中进行初始化操作,例如创建数据库,获取数据库连接等。
4. 处理URI匹配和数据查询:在Content Provider的query()方法中处理传入的URI和查询参数,然后执行查询操作,返回Cursor对象,包含查询结果。
5. 执行数据插入:在Content Provider的insert()方法中处理传入的URI和要插入的数据,然后执行插入操作。
6. 执行数据更新:在Content Provider的update()方法中处理传入的URI和要更新的数据,然后执行更新操作。
7. 执行数据删除:在Content Provider的delete()方法中处理传入的URI和要删除的数据,然后执行删除操作。
8. 内容 URI 解析:使用ContentResolver类来解析和处理getContentResolver()方法返回的内容URI,从而获得Content Provider返回的数据。
contentprovider 使用实例
一、什么是contentproviderContentProvider是Android中的四大组件之一,用于管理应用程序的私有数据并提供对这些数据的访问权限。
通过ContentProvider,应用程序之间可以共享数据,并且可以实现数据的增删改查等操作。
二、ContentProvider的基本使用1. 创建ContentProvider要创建一个ContentProvider,需要继承自android.content.ContentProvider类,并实现其中的一些方法,包括onCreate(), query(), insert(), update(), delete()等方法。
在AndroidManifest.xml文件中需要注册ContentProvider,声明该Provider所管理的数据的URI。
2. 数据库操作在ContentProvider中,一般会使用SQLite数据库来存储数据。
在实现query(), insert(), update(), delete()等方法时,需要使用SQLiteOpenHelper来创建、打开、关闭数据库,并使用SQLiteDatabase对象进行数据的增删改查操作。
3. ContentResolver的使用在应用程序中,通过ContentResolver来访问ContentProvider提供的数据。
ContentResolver是一个用于访问ContentProvider的核心类,它可以通过ContentProvider所提供的URI来操作相应的数据。
4. 权限控制在ContentProvider中,可以通过权限控制来限制其他应用程序对数据的访问。
可以在AndroidManifest.xml中声明ContentProvider所需要的权限,并在ContentProvider的实现中对权限进行验证。
三、ContentProvider的使用示例下面以一个简单的学生信息管理系统为例,演示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中,我们的应⽤有的时候需要对外提供数据接⼝,可以有如下⼏种⽅法: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));}上⾯的代码是先进⾏插⼊,然后进⾏查询并打印。
androidprovider使用解析
androidprovider使⽤解析⼀、基本概念Android四⼤组件之⼀ content provider,它主要的作⽤是:实现各个应⽤程序之间的(跨应⽤)数据共享。
在这⾥涉及到进程通信问题,⾃然在Android中使⽤的是binder来进⾏,但是由于content provider提供的数据量⼀般都⽐较⼤不能够直接进⾏传递。
所以这⾥采⽤的是⼀种叫做匿名共享内存的⽅式进⾏数据传递,在不同的进程中只需要传递⼀个⽂件描述符就可以。
通过下图对content provider有个⽐较直观的了解:ContentProvider提供了在应⽤程序之前共享数据的⼀种机制。
1)存储和获取数据提供了统⼀的接⼝。
2)对数据进⾏封装,不⽤关⼼数据存储的细节。
3)Android为常见的⼀些数据提供了默认的ContentProvider(包括⾳频、视频、图⽚和通讯录等)。
⼆、content provider的定义如果需要使⽤content provider⾸先需要在AndroidManifest中进⾏申明<provider android:authorities="list"//该provider的唯⼀IDandroid:directBootAware=["true" | "false"]android:enabled=["true" | "false"] // 能否被系统实例化android:exported=["true" | "false"] //该provider能否被其他应⽤使⽤android:grantUriPermissions=["true" | "false"]android:icon="drawable resource"android:initOrder="integer"android:label="string resource"android:multiprocess=["true" | "false"]android:name="string"android:permission="string"android:process="string"android:readPermission="string"//读权限android:syncable=["true" | "false"]android:writePermission="string" > //写权限. . .</provider>注意在provider的属性中最重要的是 authorities,它是唯⼀能够标识⼀个provider,contentprovider通过URI中的地址来查找到对应的provider,其中该URI就包含了需要寻找的provider中的authorities属性值。
AndroidContentProvider基本原理和使用详解
AndroidContentProvider基本原理和使⽤详解ContentProvider(内容提供者)是 Android 的四⼤组件之⼀,管理 Android 以结构化⽅式存放的数据,以相对安全的⽅式封装数据(表)并且提供简易的处理机制和统⼀的访问接⼝供其他程序调⽤。
Android 的数据存储⽅式总共有五种,分别是:Shared Preferences、⽹络存储、⽂件存储、外储存储、SQLite。
但⼀般这些存储都只是在单独的⼀个应⽤程序之中达到⼀个数据的共享,有时候我们需要操作其他应⽤程序的⼀些数据,就会⽤到 ContentProvider。
⽽且 Android 为常见的⼀些数据提供了默认的 ContentProvider(包括⾳频、视频、图⽚和通讯录等)。
要实现与其他的 ContentProvider 通信⾸先要查找到对应的 ContentProvider 进⾏匹配。
Android 中 ContenProvider 借助 ContentResolver 通过 Uri 与其他的 ContentProvider 进⾏匹配通信。
URI(Uniform Resource Identifier)其它应⽤可以通过 ContentResolver 来访问 ContentProvider 提供的数据,⽽ ContentResolver 通过 uri 来定位⾃⼰要访问的数据,所以我们要先了解 uri。
URI(Universal Resource Identifier)统⼀资源定位符,如果您使⽤过安卓的隐式启动就会发现,在隐式启动的过程中我们也是通过 uri 来定位我们需要打开的 Activity 并且可以在 uri 中传递参数。
URI 为系统中的每⼀个资源赋予⼀个名字,⽐⽅说通话记录。
每⼀个 ContentProvider 都拥有⼀个公共的 URI,⽤于表⽰ ContentProvider 所提供的数据。
URI 的格式如下:// 规则[scheme:][//host:port][path][?query]// ⽰例content://com.wang.provider.myprovider/tablename/id:1. 标准前缀(scheme)——content://,⽤来说明⼀个Content Provider控制这些数据;2. URI 的标识 (host:port)—— com.wang.provider.myprovider,⽤于唯⼀标识这个 ContentProvider,外部调⽤者可以根据这个标识来找到它。
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类。
黑马程序员安卓教程:ContentProvider 基本使用
ContentProvider 基本使用为了演示ContentProvider的基本用法,在该节中我们将创建两个Android工程:01-内容提供者A (简称AppA)和内容访问者B(简称AppB)。
在AppA中创建数据库user.db,该db中有两张表,t_woman和t_man。
AppA通过内容提供者对外提供数据库中的数据。
AppB作为一个内容访问者,通过内容解析者(ContentResolver)实现对AppA中的数据进行增删改查功能。
1.2.1创建工程01-内容提供者A一、在AppA中创建MySQLiteOpenHelper类在该类中实现数据库和数据表的创建业务逻辑。
【文件1-1】MySQLiteOpenHelper.java1.package com.example.contentProviderA;2.3.import android.content.Context;4.import android.database.sqlite.SQLiteDatabase;5.import android.database.sqlite.SQLiteDatabase.CursorFactory;6.import android.database.sqlite.SQLiteOpenHelper;7./**8.* 创建数据库user.db同时初始化表t_woman和t_man。
9.*10.* @author wzy2016-1-2411.*12.*/313. public class MySQLiteOpenHelper extends SQLiteOpenHelper{ 14.15.//数据库名称16.private static final String DB_NAME= "user.db";17.//数据库版本号18.private static final int VERSION =1;19.20.private MySQLiteOpenHelper(Context context, String name, CursorFactory factory,21.int version){22.super(context, name, factory,version);23.}24.25.public MySQLiteOpenHelper(Context context){26.this(context,DB_NAME, null, VERSION);27.}28.29.@Override30.public void onCreate(SQLiteDatabase db){31.String sql_woman="create table t_woman(id integer primary key,32.c_name varchar(10),c_phone varchar(20))";33.String sql_man ="create table t_man(id integer primary key,34.c_name varchar(10),c_phone varchar(20))";35.db.execSQL(sql_woman);36.db.execSQL(sql_man);37.}38.39.@Override40.public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {41.42.}43.44.}45.二、使用测试类初始化user.db为了让MySQLiteOpenHelper.java中onCreate方法被调用,我们可以采用一个测试类来实现,当然使用其他方法也是可行的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public int update(Uri uri, ContentValues values, S
tring selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection,
sMatcher.addURI("com.ljq.provider.personprovider", " person", 1);//添加需要匹配 uri,如果匹配就会返回匹配码
//如果 match()方法匹配 content://com.ljq.provider.perso
nprovider/person/230 路径,返回匹配码为 2,配 Uri 注册如下:
三、UriMatcher 类使用介绍 因为 Uri 代表了要操作的数据,所以我们经常需要解析 Uri,并从 Uri 中获取数 据。Android 提供了两个用于操作 Uri 的工具类,分别为 UriMatcher 和 ContentUris。 UriMatcher 类用于匹配 Uri,用法如下: 1、 首先需要把匹配的 Uri 路径全部进行注册,如下:
ContentProvider 删除数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于更新 ContentProvider 中的数据。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于从 ContentProvider 中获取数据。 这些方法的第一个参数为 uri,代表要操作的 ContentProvider 和对其中的什么数 据进行操作,假设给定的是: Uri.parse("content://com.ljq.providers.personprovider/person/10"),那么将会对 主机名为 com.ljq.providers.personprovider 的 ContentProvider 进行操作,操作的数 据为 person 表中 id 为 10 的记录。 使用 ContentResovler 对 ContentProvider 中的数据进行增删改查操作,如下:
CountentResovler 对象。ContentResovler 提过了和 ContentProvider 类似的四个
方法:
public Uri insert(Uri uri, ContentValues values):该方法用于往 ContentProvider 添加数据。 public int delete(Uri uri, String selection, String[] selectionArgs):该方法用于从
ContentProvider 的 scheme 已经由 Android 所规定,scheme 为 content://。 主机名(authorities)用 于唯一标识这个 ContentProvider,外部调用者可以根据 它 找 到 对 应 的 内 容 提 供 者 ( Content Prov ider )。 路径(Path)可以用来表 示我们要操作的数据,路径的构建应该根据业务而定, 如下: 要操作 Person 表中 ID 为 10 的记录,可以构建这样的路径:/person/id/10,也 可以为/prson/10,构建什么样的路径需要与 UriMatcher 中注册的匹配 Uri 相一 致。例如:/person/id/10,那么匹配 Uri 需要也需要带 id 为/preson/id/#,否则 可以写成/person/10. 要操作 person 表中的所有记录,可以这样构建路径:/person 如果要把一个字符串转换成 Uri,可以使用 Uri 类中的 parse()方法。如下: Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
//生成后的 Uri 为:content://com.ljq.provider.personprovid
er/person/10
parseId(uri)用于从路径中获取 Id,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personp
rovider/person/10")
四、ContentUris 介绍 ContentUris 用于操作 Uri 后面的 ID 部分,它有两个实用的方法: WithAppendedId(uri, id)用于为 uri 路径加上 id 部分,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personp rovider/person") Uri resultUri = ContentUris.withAppendedId(uri, 10);
ContentProvider 使用详解
一、使用 ContentProvider 共享数据 ContentProvider 在 Android 中的作用是对外提供数据,除了可以为所在应用提供 数据外,还可以共享数据给其他应用,这是 Android 中解决应用之间数据共享的 机制。通过 ContentProvider 我们可以对数据进行增删改查的操作。当应用需要 通过 ContentProvider 对外共享数据时,具体作法如下: 1、 继承系统 ContentProvider,并重写以下方法
case 1 break;
case 2 break;
default://不匹配
break; }
注册完需要匹配的 Uri 后,就可以使用 sMatcher.match(uri)对输入的 uri 进行 匹配,如果匹配正确就返回匹配码,匹配码是 addUri()方法传入的第三个参 数,假设匹配 content://com.ljq.provider.personprovider/person 路径,返回的 匹配码为 1。
public class PersonContentProvider extends onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, Strin
long personid = ContentUris.parseId(uri);//获取的结果为:1
0
五、使用 ContentProvider 共享数据 ContentProvider 类主要方法的作用: 1、 public boolean onCreate():该方法在 ContentProvider 创建后就会被调用, Android 开机后,ContentProvider 在其它应用第一次访问它时才会被创建。 2、 public int insert():该方法用于宫外部应用为 ContentProvider 中添加数据使 用。 3、 public int delete(Uri uri, String selection, String[] selectionArgs) :该方法用于 供外部应用从 ContentProvider 中删除数据。 4、 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于供外部应用更新 ContentProvider 中的数据。 5、 public cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于供外部应用查询 ContentProvider 中的数据。 6、 public String getType(uri):该方法用于返回当前 uri 代表数据的 MIME 类型。 如 果 操 作 的 数 据 属 于 集 合 类 型 , 那 么 MIME 类 型 字 符 串 应 该 以 vnd.android.cursor.dir/开头,例如,要得到所有 person 记录的 Uri 为 content://com.ljq.provider.personprovider/person,那么返回的 MIME 类型字 符 串 应 该 为 : "v nd.android.cursor.dir /pe rson" 。 如 果 要 操 作 的 数 据 类 型 为 非 集 合 类 型 , 那 么 MIME 类 型 字 符 串 应 该 以 vnd.android.cursor.item/开头。例如:得到 id 为 10 的 person 记录,Uri 为 content://com.ljq.provider.personprovider/person/10 ,那么返回的 MIME 类型 字 符 串 为 : "v nd.android.cursor.ite m/pe rson" 。
String selection, String[] selectionArgs, String sort
Order)
public String getType(Uri uri)
}
在 重 写 这 些 方 法 时 ,根 据 所 采 用 的 数 据 存 储 方 式 进 行 相 应 修 改 。通 常 使 用 的 是 SQLite 数据库存储,我们需要新建数据库操作类,并在增删改查方法中完 成对数据库的操作。 2、 需要在 AndroidManifest.xml 文件中注册我们的 ContentProvider,这样系统方 法 context.getContentResolver()才能找到我们重写的 ContentProvider。在注 册 ContentProvider 时,采用了 authorities(主机名/域名)的方法对它进行 唯一标识,ContentProvider 的标识类似于网站的域名,通过此域名我们可以 准确访问到对应网站,网站为我们提供数据。Authorities 就是 ContentProvider 的域名。注册方法如下: