为ContentProvider添加数据库事务支持-阿里云开发者社区

开发者社区> 广贤> 正文

为ContentProvider添加数据库事务支持

简介:
+关注继续查看

介绍:数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行。

事务的原子性:包含在其中的对数据库的操作序列最终要么全部执行,要么全部不执行。当全部执行时,事务对数据库的修改将生效;当全部不执行时,数据库维持原有的状态,不会被修改。

问题:最近在做一个从sdcard导入数据到数据库的功能,当导入失败时,数据库要恢复到导入前的状态。使用数据库事务处理能很好地满足到我们的需求。

我们知道Android平台上使用的sqlite数据库是支持事务处理功能的,实现的代码如下:

  1. SQLiteDatabase db =mOpenHelper.getWritableDatabase();  
  2.                    db.beginTransaction();//开始事务  
  3. //进行insertdelete update等数据库操作  
  4. db.setTransactionSuccessful();//设置事务标记为Successful  
  5. db.endTransaction();//提交事务  

可是,对于已经封装成ContentProvider的Sqlite我们应该如何让其支持事务处理功能呢?

解决办法:查看ContentProvider的API说明文档,我们惊喜地发现applyBatch(String authority,ArrayList<ContentProviderOperation> operations)这个方法,难道只需要直接使用这个方法就可以实现事务了?

谨慎起见我们先来看看ContentProvider的源码,最后追踪到这个方法:

  1. public ContentProviderResult[]applyBatch(ArrayList<ContentProviderOperation> operations)  
  2.             throwsOperationApplicationException {  
  3.        final int numOperations = operations.size();  
  4.        final ContentProviderResult[] results = newContentProviderResult[numOperations];  
  5.        for (int i = 0; i < numOperations; i++) {//遍历数据库操作序列  
  6.             results[i] =operations.get(i).apply(this, results, i);//执行数据库操作  
  7.        }  
  8.        return results;//返回结果  
  9.    }  


从上面的代码中,我们找不到和db.beginTransaction()、db.endTransaction()相似的方法,也就是说,这个方法只是进行简单的批处理,并没有保障这些数据库操作的原子性。

好吧。我们稍微动下脑筋,覆写ContentProvider的applyBatch()方法,为其添加事务处理功能。代码如下:

  1. @Override  
  2. publicContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation>operations)  
  3.             throwsOperationApplicationException{  
  4.           SQLiteDatabasedb = mOpenHelper.getWritableDatabase();  
  5.           db.beginTransaction();//开始事务  
  6.           try{  
  7.                    ContentProviderResult[]results = super.applyBatch(operations);  
  8.                    db.setTransactionSuccessful();//设置事务标记为successful  
  9.                    returnresults;  
  10.           }finally {  
  11.                    db.endTransaction();//结束事务  
  12.           }  
  13. }  


然后,我们该如何使用这个applyBatch()方法呢?applyBatch()的第一个参数实现事务的Provider的authority属性,第二个参数是数据库操作序列,构建数据库操作的对象使用了builder设计模式,下面是一个使用applyBatch()的例子:

  1. ArrayList<ContentProviderOperation>ops = new ArrayList<ContentProviderOperation>();  
  2. ops.add(ContentProviderOperation.newDelete(Person.CONTENT_URI).build());//添加一个删除Person表的操作  
  3. ops.add(ContentProviderOperation.newInsert(Home.CONTENT_URI).withValues(values).build());//添加一条记录到Home表  
  4. getContentResolver().applyBatch(PROVIDER.AUTHORITY,ops);//处理事务  

总结:

1、sqlite支持事务处理操作

2、对于封装成ContentProvider的sqlite数据库,我们可以通过覆写ContentProvider的applyBatch(Stringauthority, ArrayList<ContentProviderOperation> operations)方法来实现对事务处理的支持


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【ECS】好消息,弹性网卡支持添加辅助私网IP啦
背景 阿里云的ECS服务器,很早就支持了多网卡的挂载,卸载。近日我们又推出了新功能,每块弹性网卡又支持分配和回收多辅助私网IP地址啦。 实例列表页以及详情页支持管理主网卡的辅助私网IP 在实例列表页,在每一个实例的操作栏里点击 更多 -> 网络和安全组 -> 管理辅助私网IP,可看到,弹出了相应的...
4397 0
SpringCloud实现分库分表模式下,数据库实时扩容方案
本文源码:GitHub·点这里 || GitEE·点这里 一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 shard-eureka-7001: 注册中心 shard-tw...
3041 0
SQL Server Profiler和数据库引擎优化顾问
原文:SQL Server Profiler和数据库引擎优化顾问  简介           说到Sql的【性能工具】真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL Server Profiler就是一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接。
1120 0
数据库的未来 - HTAP,软件、硬件、云生态的融合
标签 PostgreSQL , PostGIS , 点云 , GPU , FPGA , CPU , TPU , PL/language , 科研 , 嵌入式计算 , UDF , CUDA , 数据库嵌入式编程 , 流式计算 , 科学计算 , 软硬一体 背景 随着技术的普及,越来越多以前需要很高的成本才能获取的数据,现在触手可及。
6612 0
使用SQL Server Profiler跟踪数据库
1、找到SQL Server Profiler并登录 位置:单击开始--程序--Microsoft SQL Server--性能工具--SQL Server Profiler 或者登录后在下图的位置寻找: 2、然后,进入下面的界面: 输入相关信息,单击连接进入下一个界面。 3、如下图所示界面: 4、关键点在“事件选择部分”,如下图: 小注: 要注意“列筛选器
1462 0
Dubbo 在跨语言和协议穿透性方向上的探索:支持 HTTP/2 gRPC 和 Protobuf
本文整理自刘军在 Dubbo 成都 meetup 上分享的《Dubbo 在多语言和协议穿透性方向上的探索》。 本文总体上可分为基础产品简介、Dubbo 对 gRPC (HTTP/2) 和 Protobuf 的支持及示例演示三部分,在简介部分介绍了 Dubbo、HTTP/2、gRPC、Protobuf 的基本概念和特点;第二部分介绍了 Dubbo 为何要支持 gRPC (HTTP/2) 和 P
678 0
+关注
241
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载