managedquery求助关于getcontentresolver.query
managedquery 时间:2021-06-15 阅读:(
)
managed care是什么意思
您好:
managed care
[医]管理式医疗,管理型保健;
以上结果来自金山词霸
例句:
1.
States have dabbled in managed care for decades.
美国各州初步尝试实行管理式医疗已经有数十年了。
-----------------------------------
如有疑问欢迎追问!
满意请点击右上方【选为满意回答】按钮getContentResolver.query 和 managedQuery 的区别
Activity 里面提供了一个 managedQuery() 方法,按照 Android SDK 里面的说明,“the activity will manage its lifecycle for you.” 听起来很好,Activity 可以替你管理 Cursor 的生命周期了,就不用记着去 close() 了,代码可以更简洁。
但是 Activity 是怎么去管理 Cursor 的生命周期的呢?SDK 文档没说。
最近遇到一个 bug,在一个 Activity 中,用 managedQuery() 查询数据库,将查询得到的 Cursor 用 CursorAdapter 与 ListView 绑定。
然后在 Activity 里面执行批量删除数据表记录操作,因为耗时比较长,所以用了多线程处理。
测试团队发现的 bug 是,在删除操作进行过程中,如果按下 Home 键,应用就崩溃了。
崩溃原因是 Cursor 被释放了,导致工作线程的删除操作异常。
看了 Activity.java 的源码之后就明白为什么会崩溃了。
managedQuery() 其实无非就是把查询得到的 Cursor 放到了 Activity 类的一个数组成员变量中,然后当 Activity 的时候,将这个数组里的每个 cursor 都关掉,以及在 resume 的时候,将数组里的每个 cursor 都重新查询一次。
所以在按下 Home 键之后,Activity 被 了,cursor 也就被关闭了,如果有个线程还在继续使用这个 cursor,就会抛异常了。
因此,在用 managedQuery() 的时候,需要清楚 cursor 什么时候会被释放,并考虑好自己的代码在 cursor 被释放后不再需要使用这个 cursor.
而query 出自android.content.ContentResolver.query,其实managedQuery的内部实现是调用了query,只是在query的基础上,加上了startManagingCursor操作,以管理获取的cursor。
因此,若是只用query,且对于query返回的cursor没有进行管理的话,会造成内存的泄露问题等等。
但是若是用了query后,有对返回的cursor进行了startManagingCursor操作,则这两个的效果就完全一样了。
如何使用ContentResolver
如果想公开自己的数据,那么可有两种办法:
1.创建自己的ContentProvider,需要继承ContentProvider类
2.如果你的数据和已存在的ContentProvider数据结构一致,可以将数据写到已存在的ContentProvider中
当然前提是获取写该ContentProvider的权限.比如把OA中的成员通讯信息加入到系统的联系人ContentProvider中
ContentProvider基础
所有ContentProvider都需要实现相同的接口,用于查询ContentProvider并返回数据.也包括增加、修改和删除数据.
步骤:
1.获得一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法:
ContentResolver
cr =
this.getContentResolver();
ContentResolver实例带的方法可实现找到指定的ContentProvider并获取到ContentProvider的数据
ContentResolver的查询过程开始,Android系统将确定查询所需的具体ContentProvider,确认它是否启动并运行它.
android系统负责初始化所有的ContentProvider,不需要用户自己去创建.实际上,ContentProvider的用户都不可能直接访问到ContentProvider实例,只能通过ContentResolver在中间代理.
2.数据模型
ContentProvider展示数据类似一个单个数据库表.
其中:
每行有个带唯一值的数字字段,名为_ID,可用于对表中指定记录的定位.
ContentProvider返回的数据结构,是类似JDBC的ResultSet,在android中,是Cursor对象.
URI,每个ContentProvider定义一个唯一的公开的URI,用于指定到它的数据集.
一个ContentProvider可以包含多个数据集(可以看作多张表),这样,就需要有多个URI与每个数据集对应.
这些URI要以这样的格式开头:
content://
表示这个URI指定一个ContentProvider.
如果你想创建自己的ContentProvider,最好把自定义的URI设置为类的常量,这样简化别人的调用,并且以后如果更新URI也很容易.
android定义了CONTENT_URI常量用于URI,如:android.provider.Contacts.Phones.CONTENT_URI
2.查询ContentProvider
要想使用一个ContentProvider,需要以下信息:
定义这个ContentProvider的URI,返回结果的字段名称,这些字段的数据类型
如果需要查询ContentProvider数据集的特定记录(行),还需要知道该记录的ID的值.
构建查询
查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的ContentProvider将返回一个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.一般列名都在该ContentProvider中有常量对应;
针对返回结果的过滤器,格式类似于SQL中的WHERE子句,区别是不带WHERE关键字,如果返回null表示不过滤,比如name=?;
前面过滤器的参数,是String数组,是针对前面条件中?占位符的值;
排序参数,类似SQL的ORDER
BY字句,不过不需要写ORDER BY部分,比如name desc,如果不排序,可输入null.
返回值是Cursor对象,游标位置在第一条记录之前.
下面实例适用于android 2.0及以上版本,从android通讯录中得到姓名字段:
java代码:
Cursor cursor =
getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
读取返回的数据
如果在查询的时候使用到ID,那么返回的数据只有一条记录.在其他情况下,一般会有多条记录.和JDBC的ResultSet类似,需要操作游标遍历结果集,在每行,再通过列名获取到列的值,可以通过getString()、getInt()、getFloat()等方法获取值.
比如类似下面:
java代码:
while(cursor.moveToNext())
{
builder.append(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))).append("-");
}
和JDBC中不同,没有直接通过列名获取列值的方法,只能先列名获取到列的整型索引值,然后再通过该索引值定位获取列的值.
编辑数据
可以通过ContentProvider实现以下编辑功能:
增加新的记录:
在已经存在的记录中增加新的值、批量更新已经存在的多个记录、删除记录.
所有的编辑功能都是通过ContentResolver的方法实现.一些ContentProvider对权限要求更严格一些,需要写的权限,如果没有会报错.
增加记录
要想增加记录到ContentProvider,首先,要在ContentValues对象中设置类似map的键值对,在这里,键的值对应ContentProvider中的列的名字,键值对的值,是对应列希望的类型.
然后,调用ContentResolver.insert()方法,传入这个ContentValues对象,和对应ContentProvider的URI即可.返回值是这个新记录的URI对象.这样你可以通过这个URI获得包含这条记录的Cursor对象.
比如:
java代码:
ContentValues
values = new ContentValues();
values.put(People.NAME,"Abraham
Lincoln");
Uri uri = getContentResolver().insert(People.CONTENT_URI,
values);
在原有记录上增加值
如果记录已经存在,可在记录上增加新的值,或者编辑已经存在的值.
首先要找到原来的值对象,然后要清除原有的值,然后像上面增加记录一样即可:
java代码:
Uri
uri = Uri.withAppendedPath(People.CONTENT_URI, "23");
Uri phoneUri =
Uri.withAppendedPath(uri,
People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(People.Phones.TYPE,
People.Phones.TYPE_MOBILE);
values.put(People.Phones.NUMBER,
"1233214567");
getContentResolver().insert(phoneUri, values);
批量更新值
批量更新一组记录的值,比如NY改名为Eew York.可调用ContentResolver.update()方法.
删除记录
如果是删除单个记录,调用ContentResolver.delete()方法,URI参数,指定到具体行即可.
如果是删除多个记录,调用ContentResolver.delete()方法,URI参数指定Contentprovider即可,并带一个类似SQL的WHERE子句条件.这里和上面类似,不带WHERE关键字.
创建自己的ContentProvider
创建contentprovider,需要设置存储系统.大多数ContentProvider使用文件或者SQLite数据库,不过你可以用任何方式存储数据.android提供SQLiteOpenHelper帮助开发者创建和管理SQLiteDatabase.
继承ContentProvider,提供对数据的访问.在manifest文件中声明ContentProvider.继承ContentProvider类
必须定义ContentProvider类的子类,需要实现如下方法:
java代码:
query()
insert()
update()
delete()
getType()
onCreate()
在实现子类的时候,还有一些步骤可以简化ContentProvider客户端的使用:
定义public static final
Uri常量,名称为CONTENT_URI:
java代码:
public static final Uri CONTENT_URI =
Uri.parse("content:/.example.codelab.transportationprovider");
如果有多个表,它们也是使用相同的CONTENT_URI,只是它们的路径部分不同.
声明ContentProvider
创建ContentProvider后,需要在manifest文件中声明,android系统才能知道它,当其他应用需要调用该ContentProvider时才能创建或者调用它.
语法类似:
<provider
android:name=&.easymorse.cp.MyContentProvider"
android:authorities=&.easymorse.cp.mycp">
</provider>
android:name要写ContentProvider继承类的全名.
android:authorities要写和CONTENT_URI常量的B部分android怎么把sdcard的歌曲搜到列表中
比较简单的啊。
用activity的managedquery(外部存储路径,要返回的歌曲信息如歌曲路径:media.DATA,其他参数都为Null)这样获取了cursor ,再去获取需要的。
用simplecursoradapter去绑定到iew.具体百度下求助关于getcontentresolver.query
CallLog.Calls.DEFAULT_SORT_ORDER 为 date DESC,
所以 根据您的需求可以这样写:
Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null,null, “date DESC limit 10”);
spinservers是Majestic Hosting Solutions LLC旗下站点,商家提供国外服务器租用和Hybrid Dedicated等产品,数据中心包括美国达拉斯和圣何塞机房,机器默认10Gbps端口带宽,高配置硬件,支持使用PayPal、信用卡、支付宝或者微信等付款方式。农历春节之际,商家推出了几款特别促销配置,最低双路E5-2630Lv3机器每月149美元起,下面列出几款机器...
ZJI怎么样?ZJI是一家成立于2011年的商家,原名维翔主机,主要从事独立服务器产品销售,目前主打中国香港、日本、美国独立服务器产品,是一个稳定、靠谱的老牌商家。详情如下:月付/年付优惠码:zji??下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达香港葵湾特惠B型 CPU:E5-2650L核心:6核12线程内存:16GB硬盘:480GB SSD带宽:5Mbps...
ZJI发布了9月份促销信息,针对香港华为云线路物理服务器华为一型提供立减300元优惠码,优惠后香港华为一型月付仅450元起。ZJI是原来Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月更名为ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务,商家所选数据中心均为国内访问质量高的机房和线路,比如香港阿里云、华为...
managedquery为你推荐
刷ip流量如何刷自己网站的IP流量netbios协议机子上启动了netbios协议,为什么还是运行不了netbios命令云输入法QQ云输入法怎样调整候选词的个数?音乐代码在html中插入mp3音频的代码是什么腾讯合作伙伴大会从微信同程旅行买的机票怎么打印电子发票?gbk内码高考姓名gbk内码查询backupexec怎样在vmware vcenter上安装backup exec agent for windows在线操作系统什么是网络操作系统,与普通操作系统有什么区别飞信发信息要钱吗用飞信发短信要钱吗?mpeg4格式什么是MPEG4视频格式
vps侦探 linuxapache虚拟主机 dns是什么 服务器评测 12306抢票攻略 好玩的桌面 好看的桌面背景图片 秒杀预告 softbank邮箱 adroit vip购优惠 空间技术网 电信虚拟主机 上海电信测速网站 独立主机 贵阳电信 登陆qq空间 国内空间 hostease 碳云 更多