- 浏览: 192237 次
- 性别:
- 来自: 深圳
最新评论
-
0dragon:
挺多 我试试先
android 状态栏(StatusBar) -
z494627:
这个加速插件是做什么用的?
Ubuntu10.04 搭建android平台
android ContentProvider ApplyBatch
介绍:数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行。
事务的原子性:包含在其中的对数据库的操作序列最终要么全部执行,要么全部不执行。当全部执行时,事务对数据库的修改将生效;当全部不执行时,数据库维持原有的状态,不会被修改。
问题:最近在做一个从sdcard导入数据到数据库的功能,当导入失败时,数据库要恢复到导入前的状态。使用数据库事务处理能很好地满足到我们的需求。
我们知道Android平台上使用的sqlite数据库是支持事务处理功能的,实现的代码如下:
view plain
SQLiteDatabase db =mOpenHelper.getWritableDatabase();
db.beginTransaction();//开始事务
//进行insertdelete update等数据库操作
db.setTransactionSuccessful();//设置事务标记为Successful
db.endTransaction();//提交事务
可是,对于已经封装成ContentProvider的Sqlite我们应该如何让其支持事务处理功能呢?
解决办法:查看ContentProvider的API说明文档,我们惊喜地发现applyBatch(String
authority,ArrayList<ContentProviderOperation>
operations)这个方法,难道只需要直接使用这个方法就可以实现事务了?
谨慎起见我们先来看看ContentProvider的源码,最后追踪到这个方法:
view plain
public ContentProviderResult[]applyBatch(ArrayList<ContentProviderOperation> operations) throwsOperationApplicationException { final int numOperations = operations.size(); final ContentProviderResult[] results = newContentProviderResult; for (int i = 0; i < numOperations; i++) {//遍历数据库操作序列 results =operations.get(i).apply(this, results, i);//执行数据库操作 } return results;//返回结果 }
从上面的代码中,我们找不到和db.beginTransaction()、db.endTransaction()相似的方法,也就是说,这个方法只是进行简单的批处理,并没有保障这些数据库操作的原子性。
好吧。我们稍微动下脑筋,覆写ContentProvider的applyBatch()方法,为其添加事务处理功能。代码如下:
view plain
@Override publicContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation>operations) throwsOperationApplicationException{ SQLiteDatabasedb = mOpenHelper.getWritableDatabase(); db.beginTransaction();//开始事务 try{ ContentProviderResult[]results = super.applyBatch(operations); db.setTransactionSuccessful();//设置事务标记为successful returnresults; }finally { db.endTransaction();//结束事务 } }
然后,我们该如何使用这个applyBatch()方法呢?applyBatch()的第一个参数实现事务的Provider的authority属性,
第二个参数是数据库操作序列,构建数据库操作的对象使用了builder设计模式,下面是一个使用applyBatch()的例子:
view plain
ArrayList<ContentProviderOperation>ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(Person.CONTENT_URI).build());//添加一个删除Person表的操作
ops.add(ContentProviderOperation.newInsert(Home.CONTENT_URI).withValues(values).build());//添加一条记录到Home表
getContentResolver().applyBatch(PROVIDER.AUTHORITY,ops);//处理事务
总结:
1、sqlite支持事务处理操作
2、对于封装成ContentProvider的sqlite数据库,我们可以通过覆写ContentProvider的
applyBatch(Stringauthority, ArrayList<ContentProviderOperation>
operations)方法来实现对事务处理的支持
发表评论
-
adb logcat
2013-09-24 09:22 0android adb 使用教程: http://www.os ... -
(转)android中如何获得webView中的内容
2013-05-02 16:43 1193本文概要:在程序中经常会用到webView来显示网页,但如果 ... -
(转)【Android】Paint的效果研究
2013-04-15 15:44 34752在Paint中有很多的属性可以设置,比如可以设置阴影, ... -
(转)Android 四种launchMode
2013-04-08 15:55 10731,standard 每次都会新建 ... -
(转)Android TextView中链接(link)点击事件的截取
2013-04-08 10:58 2158布局文件xml 1 <TextView 2 ... -
Android JNI介绍
2013-01-17 19:44 3081附:相关代码路径 /fr ... -
区分Activity的四种加载模式
2013-01-06 19:19 0在多Activity开发中,有 ... -
android Makefile学习总结
2012-12-17 12:07 0(1)build.prop是如何生成的 Android 的 ... -
Ubuntu10.04 搭建android平台
2012-12-03 13:02 1181转自:http://www.cnblogs.com/Wonde ... -
Android SDK中tools详解
2012-11-29 09:48 0Android SDK包含了各种各 ... -
在Eclipse中查看Android源码
2012-11-16 11:32 993两件事的解决办法: ... -
Android中的长度单位
2012-11-09 11:02 998dp 和 sp px:表示屏幕实 ... -
Android自动化压力测试图解教程——Monkey工具
2012-10-31 11:10 4396有时候我们需要对一个软件进行压力测试,检查该软件的性能。如果是 ... -
Android 移动终端camera 防偷*拍设置
2012-09-28 16:14 2477目前市面上的所有移动终端几乎都有camera 应用,但A ... -
(转)【流媒體】Android 实时视频采集—Cameara预览采集
2012-09-25 13:54 146311 概述 通过Android Camera拍摄预览中设置se ... -
(转)android CAMERA 设置照片大小
2012-09-25 12:05 5170最近在 REAL210 android 上调试 CAMERA ... -
(转)Camera构架分析
2012-09-24 13:40 1607一.Camera构架分析 Android ... -
(转)Android Camera 开发之前言
2012-09-24 10:15 1742一、 Android Camera 成像原理介绍 ... -
(转)使用Memory Analyzer tool(MAT)分析内存泄漏
2012-08-09 15:14 1096前言 在平时工作 ... -
(转)Android NDK HelloJNI
2012-07-18 14:10 1584入门的最好办法就是学习Android自带的例子, 这里就通过学 ...
相关推荐
1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作
Android ContentProvider简单实现
android contentprovider使用示例
详见http://blog.csdn.net/huaxun66/article/details/53202432
ContentProvider 实例,实现ContentProvider,从其他应用访问ContentProvider数据,实现资源共享
Android中ContentProvider的示例,详细可以参见博客:http://www.cnblogs.com/plokmju/p/android_ContentProvider.html
免费下载:android ContentProvider详细解析 讲得好详细
Android知识点ContentProvider篇
通过一个日记本实例讲解了android contentprovider的用法。
Android基于ContentProvider的音乐播放器,通过读取系统多媒体信息,得到储存在外部存储器上的所有音频文件内容,用listview显示歌曲名和歌手信息.并通过mediaPlayer进行播放.该版本只是完成了一个音乐播放器的最简单...
Android学习ContentProvider数据更新与Observer模式一Observer模式意图: 定义对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被更新。 依赖(Dependents)、发布-...
android contentprovider
Android contentprovider总结
Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作,可以直接操作数据库,也可以使用ContentProvider来对数据库进行间接操作。
Android中用ContentProvider快速查找通讯录信息的代码清单.pdf 学习资料 复习资料 教学资源
android-关于ContentProvider的使用例子 有详细注释
1.适用场景1) ContentProvider为存储和读取数据提供了统一的接口2) 使用ContentProvider,应用程序可以实现数据共享3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,...
ContentProvider的创建与访问 android
android Contentprovider的使用demo 所创建工程为andorid5.0环境,里面有四个工程,为了证明共享所以有两个程序,eclipse版本低的自己新建工程把 ContentProvider2,androidContentProvider两个工程里面拷贝出来就...
同我前面的资源一样,我的每个功能的实例都是力图实现最简短话...这个实例不讲求大而全的实现ContentProvider的所有功能,而只是为了便于理解而实现。对应于我的博客“How:ContentProvider基本功能核心框架(增删改查)”