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;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
} @Override
public 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"> <Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create Database"
/>
<Button
android: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"; @Override
protected 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() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}

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

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

 btn_addData.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public 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表中的旧数据时会被删除的,而由于异常,添加数据的代码就无法执行。而这样在一些场合下是会出大问题的。由此,事务的重要性就体现出来了。至此,我们事务的一个简单的模拟就完成了。

Android SQLite数据库之事务的学习的更多相关文章

  1. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  2. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  3. Android sqlite数据库存取图片信息

    Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...

  4. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  5. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持

    IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...

  6. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

  7. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  8. Android SQLite 数据库学习

    SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...

  9. Android——SQLite数据库(二)升级数据库、增、删、改、查、事务

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

随机推荐

  1. 线段树 SP1043 GSS1 - Can you answer these queries I

    SP1043 GSS1 - Can you answer these queries I 题目描述 给出了序列A[1],A[2],-,A[N]. (a[i]≤15007,1≤N≤50000).查询定义 ...

  2. window.performance

    利用window.performance查看网页性能 一般我们可以通过浏览器的调试工具-网络面板,或者代理工具查看网页加载过程中的各个阶段的耗时.而利用window.performance属性则可以获 ...

  3. java程序设计实验

    建立文件调试jdk idea断点调试 项目素数的寻遍

  4. C语言抽象数据类型ADT

    根据编程的问题匹配合适的数据类型.数据项连接构成了链表,定义了一个结构代表单独的项.设计了一些方法把一系列结构构成一个链表.本质上,我们使用C语言的功能设计了一种符合程序要求的新的数据类型.但是上述的 ...

  5. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_元数据

    1.元数据简介 全称:metadata 属性:数据表集合 产地:面向 CLR 的编译器在托管模块中生成 2.元数据内部结构及与托管模块的关系 [概述] 托管模块中包含着元数据,元数据是由一组数据表组成 ...

  6. jquery知识点结合使用

    1.在页面的某个具有id的element内插入其他element,并给其增加悬浮提示. $('#id').after('<div id='box'></div>'); $('# ...

  7. 制作网页logo

    一.先把jpg.png.jpeg等图片通过在线ico图标制作软件变成.ico图片 在线制作ico图标工具: http://www.bitbug.net/ 二.在head里面添加如下代码 <lin ...

  8. Linux中的netstat命令详解

    功能说明 netstat是基于Netstat这个命令行工具的指令,它可以用来查询系统上的网络套接字连接情况,包括tcp,udp以及Unix套接字:另外它还能列出路由表,接口状态和多播成员等信息. 主要 ...

  9. JavaSE---位运算符

    1.Java支持的位运算符有7个: &:按位与 [2个相同取相同.2个不同取0] |:按位或 [2个相同取相同.2个不同取1] ~:按位非 ^:按位异或 [2个相同取0.2个不同取1] < ...

  10. java替换word

    package demo; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExcept ...