当前位置: 首页 > 编程日记 > 正文

Android SQLite数据库之事务的学习

SQLite是Android系统内置的一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务。

模拟一个应用场景:进行一次转账操作,银行会将转账的金额先从你的账户中扣除,然后再向收款方的账户中添加等量的金额。看上去好像没有什么问题,可是当你的账户的金额刚刚被扣除,这是由于一些异常原因导致对方收款失败(比如突然断电),这一部分钱就凭空消失了,当然银行自然会考虑到这个问题,它会保证扣钱和收款的操作要么一起完成,要么都不会成功,而使用的技术就是事物了。

Android为了让我们能够更加方便的管理数据库,专门提供了一个SQLiteOpenHelper辅助类,借助这个类我们可以很方便的对数据库进行创建和升级。由于SQLiteOpenHelper是一个抽象类,我们需要自己创一个辅助类去继承他。

创建MyDatabaseHelper

package com.tonycheng.databasetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;/*** Created by tonycheng on 2015/6/27.*/
public class MyDatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK = "create table book(" +"id integer primary key autoincrement," +"author text," +"price real," +"pages integer," +"name text," +"category_id integer)";private Context mContext;public MyDatabaseHelper(Context context, String name,SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

写一个简单的XML布局文件,就两个按钮,一个创数据库,一个用来测试事物操作。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/create_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Create Database"/><Buttonandroid:id="@+id/replace_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Replace data"/></LinearLayout>

最后在MainActivity中修改代码:

第一步创建一个数据库:

package com.tonycheng.databasetest;import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class MainActivity extends ActionBarActivity {private MyDatabaseHelper dbHelper;private Button btn_createDatabase;private Button btn_raplaceData;private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);btn_createDatabase = (Button) findViewById(R.id.create_database);btn_raplaceData = (Button) findViewById(R.id.replace_data);btn_createDatabase.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dbHelper.getWritableDatabase();}});}
}

onCreat()方法中构建了一个MyDatabaseHelper对象,并通过构造函数的参数将数据库名指定为BookStore.db,版本号指定为1。然后在按钮的onClick事件中调用getWritableDatabase()方法创数据库。

向BookStore.db数据库中添加一条数据:在添加一个Add Data按钮

 btn_addData.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();
//第一种方法:ContentValues values
= new ContentValues();//开始组装第一条数据values.put("name","The Da Vinci Code ");values.put("author","Dan Brown");values.put("pages",510);values.put("price", 19.95);db.insert("book", null, values);
//第二种方法
//使用SQL插入数据(同理设用于其他集中操作) //两种添加数据的方法,如果你觉得上面一种方法太繁琐,就是用SQL语句来创建,他们的效果是一样的db.execSQL("insert into book(name,author,pages,price) values(?,?,?,?)",new String[]{"The Da Vinci Code","Dan Brown","510","19.95"});}});

这样数据库中就有一条数据了,我们老进行事物操作:我们从book表中删除这条数据,再添加一条新的数据:

 /*** 使用事物来进行数据库操作,两种操作要么都完成,要么都失败(事物)*/btn_raplaceData.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.beginTransaction();//开启事物try {db.delete("book",null,null);if (true){//这里手动抛出一个异常,让事物失败//  throw new NullPointerException();//由于我们手动抛出了一个异常,这样添加数据的代码就无法执行了,但是由于事物的存在,此时旧数据也无法删除
                    }db.execSQL("insert into book(name,author,pages,price) values(?,?,?,?)", new String[]{"android ", "tonycheng", "550", "79"});db.setTransactionSuccessful();}finally {db.endTransaction();}}});

运行上面的代码,发现表中的数据没有被删除,这是由于我们启用了事务,故意手动抛出了一个异常,导致旧数据也无法删除,如果没有启用事务,book表中的旧数据时会被删除的,而由于异常,添加数据的代码就无法执行。而这样在一些场合下是会出大问题的。由此,事务的重要性就体现出来了。至此,我们事务的一个简单的模拟就完成了。

转载于:https://www.cnblogs.com/tonycheng93/p/4605225.html

相关文章:

1组合逻辑电路--多路选择器与多路分解器

1.2多路选择器 1.2.1不带优先级的多路选择器 四路选择器如下 代码如下 View Code 1 module multiplexer 2 ( 3 input iA, 4 input iB, 5 input iC, 6 input iD, 7 input [1:0] iSel, 8 output reg oQ 9 );10 11 always (*)12 begin13 case(iSel)1…

java——慎用可变参数列表

说起可变参数&#xff0c;我们先看下面代码段&#xff0c;对它有个直观的认识&#xff0c;下方的红字明确地解释了可变参数的意思&#xff1a; 1 public class VarargsDemo{2 3 static int sum(int... args) {4 int sum 0;5 for(int arg:args)6 …

一位老码农的分享:一线程序员该如何面对「中年危机」?

如果这是第二次看到我的文章&#xff0c;欢迎文末扫码订阅我个人的公众号&#xff08;跨界架构师&#xff09;哟~ 本文长度为2728字&#xff0c;建议阅读8分钟。坚持原创&#xff0c;每一篇都是用心之作&#xff5e;先来聊一下这个问题的背景吧。前两天有小伙伴问到Z哥这个问题…

白话spring依赖注入

Spring能有效地组织J2EE应用各层的对象。Action&#xff1f;Service&#xff1f;DAO&#xff1f;&#xff0c;都可在Spring的管理下有机地协调、运行。Spring将各层的对象以松耦合的方式组织在一起&#xff0c;对象与对象之间没有直接的联系&#xff0c;各层对象的调用完全面向…

2软件测试初相识

软件测试初相识 软件测试初识为什么要做软件测试,做软件测试的必要性是什么?关于软件测试的定义有很多种软件测试的两面性软件测试的价值总结软件测试初相识 文章目录 软件测试初识为什么要做软件测试,做软件测试的必要性是什么?关于软件测试的定义有很多种软件测试的两面性…

【go】sdk + idea-plugin 开发工具安装

http://golang.org/doc/install/source第一步&#xff1a;windows 安装 git第二步$ git clone https://go.googlesource.com/go $ cd go $ git checkout go1.4.1保持翻墙姿势 D:\Program Files (x86)\Git\bin>git clone https://go.googlesource.com/go Cloning into go... …

无限极:对虚假宣传行为查处不力 推十条整改措施

中新网1月28日电 无限极今日发表声明称&#xff0c;将进一步响应整治“保健”市场乱象百日行动&#xff0c;承担主体责任&#xff0c;落实专项整改。 声明全文如下&#xff1a; 1月8日&#xff0c;国家市场监督管理总局等13部委联合发出《关于开展联合整治“保健”市场乱象百日…

基于WTL自绘 - 表情选择界面

1.无窗口绘制(网格&#xff0c; 背景&#xff0c;图片&#xff0c;预览)。2.采用Cximage处理图像。3.关于源码 请发邮件 satngqq.com4.已经增加到wtl_duilib 0.5版Demo中转载于:https://www.cnblogs.com/satng/archive/2011/08/13/2138780.html

3软件测试原理与软件缺陷

软件测试原理与软件缺陷 文章目录 前言软件测试原理软件缺陷总结前言 知其然,更要知其所以然。 软件测试原理 下图中很直观的展示出了软件测试原理。根据测试目标设计测试输出,依据测试依据(包括软件需求、设计等)给出预期结果,在被测对象上运行得到运行结果,将运行结果…

Oracle wrap 和 unwrap( 加密与解密) 说明

一. Wrap 说明官网的说明如下&#xff1a;A PL/SQL Source Text Wrappinghttp://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/wrap.htm#LNPLS1744You can wrap the PL/SQL source text for any of these stored PL/SQL units, thereby preventing anyone from di…

python的沙盒环境virtualenv(二)--简单使用

安装 sudo apt-get install python-virtualenv使用方法 virtualenv [虚拟环境名称] 如&#xff0c;创建**ENV**的虚拟环境 virtualenv ENV默认情况下&#xff0c;虚拟环境会依赖系统环境中的site packages&#xff0c;就是说系统中已经安装好的第三方package也会安装在虚拟环境…

使用Powershell批量为Azure资源添加Tags

在使用Azure的过程中&#xff0c;我们可以将Tags应用于Azure资源&#xff0c;从而可以将元数据逻辑的组织到某些分类中。每个Tags由名称和值组成。例如&#xff0c;我们可以将名称“Environment”和值“Production”应用于生产中的所有资源。应用Tags以后&#xff0c;我们可以使…

4软件测试阶段

软件测试流程和规范前言软件测试阶段总结前言 不以规矩&#xff0c;不成方圆。 软件测试阶段 在软件测试中主要的测试阶段包括文档集测试、单元测试、集成测试、系统测试&#xff08;包括功能测试和非功能测试&#xff09;、安装测试、验收测试。 总结 不同的测试阶段有不同…

InfluxDB 2.0 Alpha展开测试!将会加入查询语言Flux

InfluxData释出其开源时序数据库InfluxDB 2.0 Alpha测试版&#xff0c;这个版本最大的更新&#xff0c;便是增加了新的数据脚本和查询语言Flux&#xff0c;不只能提供跨平台时序数据操作&#xff0c;还能将TICK组件堆栈整合成一个更加一致的平台。InfluxDB是一个以Go语言开发的…

Weka 开发[1]-Instances类

先google一下&#xff0c;把Weka软件下载下来&#xff0c;安装完成之后&#xff0c;在Weka的安装目录中有一个weka.jar的包。 把包添加到工程中后&#xff0c;就可以调用weka中的函数了。 再介绍一点weka的基本知识&#xff0c;在weka的目录下&#xff0c;有一个data的文件夹&a…

SQL Server 2005 18452登录错误 的解决方法

无法连接到服务器 服务器&#xff1a;消息18452&#xff0c; 级别16&#xff0c;状态1 [Microsoft][ODBC SQL Server Driver][SQL Server]用户‘sa’登陆失败。原因&#xff1a;未与信任SQL Server连接相关联 该错误发生的原因是由于SQL Ser…

5软件开发与软件测试

软件开发与软件测试 前言瀑布模型V模型总结前言 软件测试与软件开发过程是相辅相成、相互依赖、相互转换的过程。 瀑布模型 瀑布模型规定了软件生命周期中的各项活动,包括需求分析、概要设计、编码、测试、验收与交付、使用与维护等。瀑布模型中各个软件过程是自上而下、相互…

认识docker

一、Docker工作原理 二、Docker容器和虚拟机对比 三、镜像容器管理 1、Docker关键组件 2、Docker架构 3、Docker内部组件 镜像&#xff08;Image&#xff09;——一个特殊的文件系统 Docker 镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置…

Enterprise Library系列文章回顾与总结

Enterprise Library系列文章回顾与总结 自Enterprise Library 1.1 推出以来&#xff0c;Terry写了一系列的关于Enterprise Library的文章&#xff0c;其中得到了很多朋友的支持&#xff0c;在这里一并表示感谢。为了方便大家的阅读&#xff0c;这里我做了一下整理与分类。第Ⅰ部…

句法模式识别(两)-正规文法、上下文无关文法

正规的语法特点 1.全部长度有限的语言都是正规的。 2.用正规文法当然能产生无限长串&#xff0c;当中周期反复部分的长度不大于非终止符的长度。 举个样例 在此规则之下。能生成句子 当中周期反复部分为ab&#xff0c;这个样例的非终止符的元素个数为2&#xff0c;故满足2不大于…

6软件测试过程

软件测试过程前言软件测试的几个典型过程总结前言 测试策划、测试设计与实现、测试执行、回归测试和测试总结。 软件测试的几个典型过程 软件测试过程主要包括测试策划、测试设计与实现、测试执行、回归测试和测试总结&#xff0c;每个活动过程中包括的主要工作内容如下图所示…

BFS之三(单向bfs和康托压缩)

//poj 1077 Eight#include <iostream> //单向bfs和康托压缩#include<string>using namespace std;bool visited[1000000];int fac[]{1,1,2,6,24,120,720,5040,40320,362880}; //9!表int cantor(int arr[]) {int temp,num1; //当排列为…

[JavaWeb基础] 007.Struts2的配置和简单使用

1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架&#xff0c;用于快速开发Java Web应用。Struts实现的重点在C(Controller)&#xff0c;包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签&#xff08;C…

使用Rust + Electron开发跨平台桌面应用 ( 一 )

前言 近段时间学习了Rust&#xff0c;一直想着做点什么东西深入学习&#xff0c;因为是刚学习&#xff0c;很多地方都不熟悉&#xff0c;所以也就不能拿它来做编译器这些&#xff0c;至于web开发&#xff0c;实际上我并不建议拿这个来学习一门语言&#xff0c;大概有几个方面&a…

7软件质量与测试规范

软件质量与测试规范 前言标准/规范产品质量模型总结前言 标准和规范可以指导测试工作的方向。 标准/规范 软件质量与测试标准分为国际标准、国家标准、行业标准、企业(机构)规范、项目规范等。下一层标准需要在上一层标准的框架下做扩展或补充。比如行业标准首先要满足国家…

UVa 679 - Dropping Balls

称号&#xff1a;有一个完整的二叉树&#xff0c;每个节点是一个开关&#xff0c;最初的全封闭&#xff0c;球从顶点丢弃。 每次通过开关球将将其状态反转。现在先问k球落到d当层交换机经过号。分析&#xff1a;进制编码。经过模拟几次能够看出&#xff0c;球会让开关形成连续二…

【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合

上篇博文介绍了StreamInsight基础查询操作中的用户自定义聚合部分。这篇文章将主要介绍如何在StreamInsight查询中使用分组聚合。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;var weatherData new[] {new { Timestamp new DateT…

生态环境部:提升5.5亿居民饮用水环境安全保障水平

资料图&#xff1a;备用水源。于从文 摄 中新网1月30日电 据生态环境部网站消息&#xff0c;生态环境部牵头扎实推进饮用水水源地环境保护专项行动&#xff0c;成效显著。截至2018年12月31日&#xff0c;除9个问题因冬季施工难度大或实际工程量大等因素仍在整治外&#xff0c;…

8单元测试的必要性

单元测试的必要性 前言单元测试堪比汽车零件检测总结前言 积土成山,风雨兴焉。 单元测试堪比汽车零件检测 据估计,一般轿车约由1万个不可拆解的独立零部件组装而成。结构极其复杂的特制汽车,,如F1赛车等,其独立零部件的数量可达到2万个之多。可以设想下,如果汽车组装企业…

朴素高精度乘法的常数优化

2015年辽宁省赛热身赛有一道高精度乘法 传送门&#xff1a;NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec 内存限制: 128 MB题目描述 Calculate $a \times b$. 输入 Your program will be tested on one or more test cases. In each test case, two integer $a$, $b$ ($0\le …