Android是如何实现应用程序之间数据共享的?我们以前谈到外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据,今天我们来谈下如何创建自己的ContentProvider来实现应用程序之间的数据共享。
一个应用程序可以创建自己的数据,这个数据对该应用程序来说是私有的,外界更本看不到,也不知道数据是如何 存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例 如:添加(insert)、删除(delete)、查询(query)、修改(update)。
Android为我们提供了ContentProvider来实现数据的共享,一个程序如果想让别的程序可以操作自己的数据,就定义自己的 ContentProvider,然后在AndroidManifest.xml中注册,其他application可以通过获取 ContentResolver通过Uri来操作上一程序的数据。
Android中的电话本等数据就是通过ContentProvider实现数据共享的,系统中有很多已经存在的共享Uri。我们可以使用ContentResolver通过Uri来操作不同表的数据;如Contacts.People.CONTENT_URI
什么是URI?
将其分为A,B,C,D 4个部分:
A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"
B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称 ;"content://hx.android.text.myprovider"
C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了;"content://hx.android.text.myprovider/tablename"
D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; "content://hx.android.text.myprovider/tablename/#" #表示数据id
这里主要是说明如何创建自己的ContentProvider,这里有几个常用的类
UriMatcher:用于匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路径全部给注册上,如下: //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。 UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1 uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码 //如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2 uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
· withAppendedId(uri, id)用于为路径加上ID部分
· parseId(uri)方法用于从路径中获取ID部分
其他要用到的类程序中已添加说明自己写了一个小的测试程序,附在下面有想了解的可以看一下程序是基于同一个application的。
对应自定义ContentProvider的使用找到以下资料:
Android开发中的ContentProvider数据模型概述
Android中ContentProvider和ContentResolver使用入门
ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的数据,是否需要启动这个应用程序?这个问题在 Android SDK中没有明确说明,但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。 这就要求在AndroidManifest.XML中使用元素明确定义。 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数 据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时 候,需要考虑是元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange() 接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似 register,unregister的接口。 至此,已经对ContentProvider提供了比较全面的分析,至于如何创建ContentProvider,可通过2种方法:创建一个属于你自己的 ContentProvider或者将你的数据添加到一个已经存在的ContentProvider中,当然前提是有相同数据类型并且有写入 Content provider的权限。
分享到:
相关推荐
在Android应用开发中,数据持久化是一个至关重要的环节,而Android Room和ContentProvider是其中的两个关键组件。本文将深入探讨这两个技术,并结合实际案例,解释如何在Android应用中使用它们来管理和共享SQLite...
2. 创建ContentProvider:要创建一个ContentProvider,你需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`query()`, `insert()`, `update()`, `delete()` 和 `getType()`。 3. 注册...
`android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的数据共享。以下是对这个主题的详细阐述: 一、ContentProvider概述 ...
在ContentProvider中,通常会定义一个UriMatcher对象来处理不同的URI请求,以及一个SQLiteOpenHelper实例来操作数据库。 为了使其他组件能够通过ContentResolver访问ContentProvider,我们需要在AndroidManifest....
这样,其他应用就可以通过调用`ContentResolver`的相应方法,如`query()`, `insert()`, `update()`, `delete()`来访问和操作ContentProvider中的数据。 在数据共享的场景下,应用A通过ContentProvider暴露自己的...
3. **SQLite数据库操作**: 在ContentProvider中,通常会有一个SQLiteOpenHelper子类用于管理数据库的创建、升级和版本管理。在ContentProvider的上述方法中,我们可以使用SQLiteOpenHelper来执行SQL语句,与数据库...
在ContentProvider中,你需要根据UriMatcher匹配到相应的操作,并调用SQLiteOpenHelper的方法对数据库进行增删改查操作。比如在query()方法中,你可以这样查询数据: ```java @Override public Cursor query(Uri ...
在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...
自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在Android项目中实现一个自定义的ContentProvider。 1. **理解ContentProvider** ContentProvider...
3. **缓存策略**:对于频繁查询的数据,可以考虑在ContentProvider中实现缓存机制,提高访问效率。 总结,ContentProvider在Android中扮演着数据共享的关键角色。理解并熟练掌握ContentProvider的创建与访问,对于...
Uri(Uniform Resource Identifier)是互联网上的资源标识符,而在Android中,Uri主要用于定位ContentProvider中的数据。Uri通常由两部分组成:authority和path。Authority是ContentProvider的唯一标识,一般与应用...
通过ContentResolver,任何应用都可以查询、插入、更新或删除ContentProvider中存储的数据。ContentProvider的结构包括URI、MIME类型和Cursor,这些元素共同构成了数据操作的基础。 二、ContentProvider的主要功能 ...
在Android系统中,ContentProvider是四大组件之一,它是应用程序间数据共享的核心机制。ContentProvider使得一个应用的数据可以被其他应用访问,甚至在不同设备之间进行同步。本章将深入探讨ContentProvider的原理、...
- `Uri`(统一资源标识符)是ContentProvider的核心,它唯一标识了ContentProvider中的一个或一组数据项。通常, Uri由两部分组成:authority(权限)和path(路径)。 - `MIME类型`用于描述数据的类型,如文本、...
通过这个Demo,开发者可以学习如何创建自己的ContentProvider,从而在应用间有效地传递和管理数据。理解并掌握ContentProvider的使用,对于开发复杂的多应用协作场景非常有益,也是提升Android开发能力的重要一环。
在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全、方便地访问和操作数据。本实例主要讲解如何在Android中利用ContentProvider实现通讯录功能,这对于理解...
在Android应用开发中,SQLite和ContentProvider是两个非常重要的组件,它们主要用于数据存储和数据共享。SQLite是一个轻量级的数据库系统,适用于移动设备,而ContentProvider则是一种接口,允许不同应用程序之间...
Uri(统一资源标识符)用于唯一标识ContentProvider中的数据,通常由authority和路径两部分组成。 4. **使用ContentProvider步骤** - **注册ContentProvider**:在AndroidManifest.xml中添加provider标签,设置...
- URI(Uniform Resource Identifier)用于唯一标识ContentProvider中的数据资源。 - UriMatcher用于解析传入的URI,确定应调用哪个ContentProvider方法。开发者需要为每种类型的URI注册一个匹配码,并在...