- 浏览: 229194 次
- 性别:
- 来自: 北京
最新评论
-
qq452739204:
如果构造的报文大于mtu值,是否需要分片之后再发送出去列?
Linux内核构造数据包并发送(二)(dev_queue_xmit方式) -
xingzengmou:
你好,我搞的原理跟你差不多,但播放的时候有papapa的声音, ...
AudioRecord和AudioTrack类的使用 -
wenjiefeng:
楼主,你有录制pcm格式和播放pcm格式的录音器的demo吗, ...
AudioRecord和AudioTrack类的使用 -
lovepeakingA:
...
AudioRecord和AudioTrack类的使用 -
ZaneLee007:
假的,不学无术
Android禁用键盘的所有按键
Android中的Content provider机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。
Android提供了一些主要数据类型的Content provider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些android提供的Content provider。可以获得这些Content provider,查询它们包含的数据,当然前提是已获得适当的读取权限。
如果想公开自己的数据,那么可有两种办法:
- 创建自己的Content provider,需要继承ContentProvider类;
- 如果你的数据和已存在的Content provider数据结构一致,可以将数据写到已存在的Content provider中,当然前提是获取写该Content provider的权限。比如把OA中的成员通讯信息加入到系统的联系人Content provider中。
Content provider基础所有Content provider都需要实现相同的接口用于查询Content provider并返回数据,也包括增加、修改和删除数据。首先需要获得一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法:
- ContentResolver cr = getContentResolver();
ContentResolver实例带的方法可实现找到指定的Content provider并获取到Content provider的数据。ContentResolver的查询过程开始,Android系统将确定查询所需的具体Content provider,确认它是否启动并运行它。android系统负责初始化所有的Content provider,不需要用户自己去创建。实际上,content provider的用户都不可能直接访问到content provider实例,只能通过ContentResolver在中间代理。数据模型Content provider展示数据类似一个单个数据库表。其中:
- 每行有个带唯一值的数字字段,名为_ID,可用于对表中指定记录的定位;
- Content provider返回的数据结构,是类似JDBC的ResultSet,在android中,是Cursor对象。
URI每个content provider定义一个唯一的公开的URI,用于指定到它的数据集。一个content provider可以包含多个数据集(可以看作多张表),这样,就需要有多个URI与每个数据集对应。这些URI要以这样的格式开头:
- content://
表示这个uri指定一个content provider。如果你想创建自己的content provider,最好把自定义的URI设置为类的常量,这样简化别人的调用,并且以后如果更新URI也很容易。android定义了CONTENT_URI常量用于URI,比如:
- android.provider.Contacts.Phones.CONTENT_URI
- android.provider.Contacts.Photos.CONTENT_URI
要注意的是上面例子中的Contacts,已经在android 2.0及以上版本不赞成使用。查询Content provider要想使用一个content provider,需要以下信息:
- 定义这个content provider的URI
- 返回结果的字段名称
- 这些字段的数据类型
如果需要查询content provider数据集的特定记录(行),还需要知道该记录的ID的值。构建查询查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的content provider将返回一个Cursor对象。可以通过ContentResolver.query()或者Activity.managedQuery()方法。两者的方法参数完全一样,查询过程和返回值也是相同的。区别是,通过Activity.managedQuery()方法,不但获取到Cursor对象,而且能够管理Cursor对象的生命周期,比如当Activity暂停(pause)的时候,卸载该Cursor对象,当Activity restart的时候重新查询。另外,也可以对一个没有处于Activity管理的Cursor对象做成被Activity管理的,通过调用Activity.startManaginCursor()方法。类似这样:
- Cursor cur = managedQuery(myPerson, null, null, null, null);
其中第一个参数myPerson是Uri类型实例。如果需要查询的是指定行的记录,需要用_ID值,比如ID值为23,URI将是类似:
- content://. . . ./23
android提供了方便的方法,让开发者不需要自己拼接上面这样的URI,比如类似:
- Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23);
或者:
- Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23");
二者的区别是一个接收整数类型的ID值,一个接收字符串类型。其他几个参数:
- names,可以为null,表示取数据集的全部列,或者声明一个String数组,数组中存放列名称,比如:People._ID。一般列名都在该Content provider中有常量对应;
- 针对返回结果的过滤器,格式类似于SQL中的WHERE子句,区别是不带WHERE关键字,如果返回null表示不过滤,比如name=?;
- 前面过滤器的参数,是String数组,是针对前面条件中?占位符的值;
- 排序参数,类似SQL的ORDER BY字句,不过不需要写ORDER BY部分,比如name desc,如果不排序,可输入null。
返回值是Cursor对象,游标位置在第一条记录之前。下面实例适用于android 2.0及以上版本,从android通讯录中得到姓名字段:
- Cursor cursor = getContentResolver().query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
- null,
- null);
所有的编辑功能都是通过ContentResolver的方法实现。一些Content provider对权限要求更严格一些,需要写的权限,如果没有会报错。增加记录要想增加记录到content provider,首先,要在ContentValues对象中设置类似map的键值对,在这里,键的值对应content provider中的列的名字,键值对的值,是对应列希望的类型。然后,调用ContentResolver.insert()方法,传入这个ContentValues对象,和对应Content provider的URI即可。返回值是这个新记录的URI对象。这样你可以通过这个URI获得包含这条记录的Cursor对象。比如: 继承ContentProvider类必须定义ContentProvider类的子类,需要实现如下方法:query() ,insert() ,update() ,delete() ,getType() ,onCreate()query()方法,返回值是Cursor实例,用于迭代请求的数据。Cursor是一个接口。android为该接口提供了一些只读的(和JDBC的ResultSet不一样,后者还提供可写入的可选特性)Cursor实现。比如SQLiteCursor,可迭代SQLite数据库中的数据。可以通过SQLiteDatabase类的query()方法获取到该Cursor实例。还有其他的Cursor实现,比如MatrixCursor,用于数据不是存储在数据库的情况下。因为Content provider可能被多个ContentResolver对象在不同的进程和线程中调用,因此实现Content provider必须考虑线程安全问题。作为良好的习惯,在实现编辑数据的代码中,要调用ContentResolver.notifyChange()方法,通知那些监听数据变化的监听器。在实现子类的时候,还有一些步骤可以简化Content provider客户端的使用:定义public static final Uri常量,名称为CONTENT_URI:
返回值的内容
返回值的内容类似上图,不同的content provider会有不同的列和名称,但是会有两个相同的列,上面提到过的一个是_ID,用于唯一标识记录,还有一个_COUNT,用于记录整个结果集的大小,可以看到上面图中的_COUNT的值是相同的。读取返回的数据如果在查询的时候使用到ID,那么返回的数据只有一条记录。在其他情况下,一般会有多条记录。和JDBC的ResultSet类似,需要操作游标遍历结果集,在每行,再通过列名获取到列的值,可以通过getString()、getInt()、getFloat()等方法获取值。比如类似下面:
_ID
_COUNT
NAME
NUMBER
44
3
Alan Vain
212 555 1234
13
3
Bully Pulpit
425 555 6677
53
3
Rex Cars
201 555 4433
和JDBC中不同,没有直接通过列名获取列值的方法,只能先列名获取到列的整型索引值,然后再通过该索引值定位获取列的值。编辑数据可以通过content provider实现以下编辑功能:
在原有记录上增加值如果记录已经存在,可在记录上增加新的值,或者编辑已经存在的值。首先要过去到原来的值对象,然后要清除原有的值,然后像上面增加记录一样即可:
批量更新值批量更新一组记录的值,比如NY改名为Eew York。可调用ContenResolver.update()方法。删除记录如果是删除单个记录,调用ContentResolver.delete()方法,URI参数,指定到具体行即可。如果是删除多个记录,调用ContentResolver.delete()方法,URI参数指定Content provider即可,并带一个类似SQL的WHERE子句条件。这里和上面类似,不带WHERE关键字。创建自己的Content provider创建content provider,需要:
如果有多个表,它们也是使用相同的CONTENT_URI,只是它们的路径部分不同。
也就是说红色框部分是一致的。定义返回的列名,public static final,列名的值,比如使用SQLite数据库作为存储,对应表的列名。在文档中要写出各个列的数据类型,便于使用者读取。如果需要处理新的MIME数据类型,比如通过Intent的方式,并且带data的mimeType,那么需要在ContentProvider.getType()方法中进行处理。声明Content Provider创建Content Provider后,需要在manifest文件中声明,android系统才能知道它,当其他应用需要调用该Content Provider时才能创建或者调用它。语法类似:
android:name要写ContentProvider继承类的全名。android:authorities要写和CONTENT_URI常量的B部分(见上面图)。注意不要把上图C和D部分加到authorities中去。authorities是用来识别ContentProvider的,C和D部分实际上是ContentProvider内部使用的。
发表评论
-
从assets文件夹中读取txt文件
2010-08-23 14:37 2658Android除了提供/res目录存放资源文件外,在/asse ... -
AndroidManifest.xml文件综合详解
2010-08-18 09:59 1067一,重要性AndroidManifest. ... -
Android动态创建一个个组件
2010-08-12 00:11 2942Android 界面编程有两种基本的方法,一种是在代码中,动态 ... -
LinearLayout+EditText+Button+AlertDialog简单应用
2010-08-11 22:08 2266这个简单的例子是EditText中默认有个字符串text,单击 ... -
android实现底部菜单栏
2010-08-11 20:43 1742android程序,许多时候需要菜单栏显示在底部或顶部,但是没 ... -
Android permission 访问权限大全
2010-08-11 20:41 1011androidmanifest.xml中声明相关权限请求, 完 ... -
Android的几种布局方式
2010-08-11 20:27 4961通常我们开发的应用程序都是需要具有友好的用户界面,那么Andr ... -
Android的系统架构
2010-08-11 20:10 1564Android的系统架构是怎么样的呢?从下图我们可以从整体上有 ... -
Android响应按钮的程序结构
2010-08-11 20:07 1944图形界面的按钮是最普通的控件,Android响应按钮的程序结构 ... -
AudioRecord和AudioTrack类的使用
2010-08-11 20:06 14902AudioRecord和AudioTrack类 ... -
Android资源文件
2010-08-10 10:34 1364资源是您在代码中使用 ... -
SMS Messaging in Android(接1)
2010-08-09 00:12 1090就是它了!测试应用程序,按下F11。为每个Android模拟器 ... -
SMS Messaging in Android(1)
2010-08-08 23:54 1764可以安全的说,在过去的近20年里卖的每一款移动电话都拥有SMS ... -
Android sms 发送、接收及格式
2010-08-08 21:49 2195一、 android sms所要的权限 Java代码 ... -
Android Button按钮控件美化方法
2010-08-08 21:11 2811对于Android自带的Button按钮控件很多网友感觉不是很 ... -
Android布局之AbsoluteLayout
2010-08-08 18:34 1836AbsoluteLayout也就是绝对布局,又称坐标布局,在布 ... -
Android移植: wifi设计原理(源码分析)
2010-08-08 02:22 2344初始化在 SystemServer 启动的时候,会生成一个 ... -
Android禁用键盘的所有按键
2010-08-07 23:52 4258KeyguardManager keyguardManager ...
相关推荐
本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、Read、Update、Delete)操作,以及如何访问和监听Content Provider的数据变化,并通过实际案例分析如何使用Content Provider处理短信和...
总结来说,Content Provider是Android数据共享的核心机制,通过它可以实现跨应用的数据交互。这个demo包含的两个项目将详细展示如何构建和使用Content Provider,以及如何结合SQLite数据库进行数据管理。通过学习和...
总结来说,Content Provider是Android中数据共享的关键,而SQLite则提供了可靠的数据存储解决方案。结合两者,开发者可以构建起强大的数据管理系统,使数据能在多个应用间安全、有效地流通。学习并熟练掌握这两者,...
### Content Provider 在 Android 中的应用 #### 一、概述 Content Provider 是 Android 四大组件之一,主要用于实现跨应用之间...通过本文的学习,相信初学者已经能够理解 Content Provider 的基本原理及使用方法。
### 四大组件详解:Activity、Service、Content Provider与Broadcast Receiver #### 一、Activity **定义:** Activity是Android应用程序中的四大基本组件之一,它代表一个屏幕界面,用户可以直接与其进行交互。每...
总结,通过Content Provider,开发者可以方便地在Android应用之间共享数据,特别是对于系统级的数据如通讯录,Content Provider提供了标准的接口和流程。掌握Content Provider的使用,不仅可以提升应用的可扩展性,...
总结来说,自定义Content Provider是Android开发中实现数据共享的关键。通过创建自己的Provider,开发者可以将自己的应用数据开放给其他应用,同时控制数据访问的权限。这个过程涉及到数据库操作、Uri匹配和权限管理...
总结起来,Content Provider 在 Android 中扮演着数据共享的重要角色,它为不同应用程序之间的数据交换提供了标准化的接口和机制。理解并熟练运用 Content Provider,可以帮助开发者构建更加健壮、可扩展的应用程序...
总结来说,Content Provider的共享数据更新通知机制是通过ContentService、ContentResolver和ContentObserver三者的协作实现的。ContentService作为服务注册中心,ContentResolver作为通信桥梁,ContentObserver则...
【FileProvider使用demo】 在Android开发中,FileProvider是一个非常重要的组件,它是Android系统提供的一种安全分享文件的方式。FileProvider可以避免直接使用file:// Uri可能导致的安全问题,因为这种Uri方式可能...
总结来说,通过Content Provider和AutoCompleteTextView,Android应用能够安全、高效地实现跨进程数据共享和交互。理解并熟练掌握这两者,对于构建复杂的多组件协作的应用至关重要。在阅读提供的博客链接...
总结一下,【Content-Provider-Kotlin】项目将指导你如何使用Kotlin来构建高效、易维护的Content Provider,从而在Android应用间实现数据共享。通过这个项目,你将学习到如何使用Kotlin的特性来优化Content Provider...
总结,Content Provider是Android中实现数据共享的关键组件,通过合理的使用和设计,可以提升应用间的协作能力,提高用户体验。了解并熟练掌握Content Provider的使用,对于Android开发者来说至关重要。
总结来说,这个示例项目提供了一个学习Content Provider的基础平台,涵盖了从创建提供者类、定义URI到使用ContentResolver进行数据操作的所有关键步骤。对于任何想要在Android平台上进行数据共享和跨应用通信的...
总结,Content Provider是Android中实现跨应用数据共享的关键机制。无论是访问系统内置服务,如联系人、日历等,还是构建自定义的数据交换方案,理解并掌握Content Provider的使用都是至关重要的。通过上述的实例...
下面我们将通过一个简单的例子来创建和使用自定义的Content Provider。 首先,我们需要创建一个Content Provider类,继承自ContentProvider,并实现其关键方法,如: - onCreate():初始化Content Provider。 - ...
总结来说,本项目“content_provider:使用sqlite android”将深入讲解如何结合SQLite数据库和Content Provider,实现Android应用间的数据共享和管理。通过学习和实践,开发者不仅可以掌握Android数据存储的核心技术...
"Contentprovider Android"这个主题涵盖了如何创建和使用Content Provider,以及通过SQLite数据库存储数据的相关知识。 首先,让我们深入了解一下Content Provider。Content Provider是Android系统中提供统一数据...
在Android编程中,组件是构建应用程序的基本单元,主要包括四大组件:Activity、Service、Content Provider和BroadcastReceiver。每个组件都有其独特的生命周期,理解并熟练掌握这些生命周期对于开发高效、稳定的...
总结起来,`FileProvider`是Android系统提供的一种安全的文件共享机制,它通过`Uri`授权其他应用访问特定文件。开发者可以通过注册`FileProvider`、定义可共享的文件路径、创建带权限的`Uri`以及在Intent中传递`Uri`...