sqllite事务和MySQL事务_Android学习---SQLite数据库的增删改查和事务(transaction)调用...

上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句.

首先,创建一个新的android项目:

c2769426f57e88dff542cfaae175b11e.png

34b995c2d3aab852c8e3f458884887ee.png

其次,查看代码实现增删查改:

1.创建DB工具类

MyDBHelper.java(创建数据库的操作)

packagecom.amos.android_db;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;/*** Created by amosli on 14-6-12.*/

public class MyDBHelper extendsSQLiteOpenHelper{/***

*@paramcontext*/

publicMyDBHelper(Context context) {super(context, "sqlitedb", null, 1);

}/*** 数据库第一次创建的时候调用此方法

*@paramdb*/@Overridepublic voidonCreate(SQLiteDatabase db) {

db.execSQL("create table if not exists person (personid integer primary key autoincrement ,name varchar(30) ,age integer(3) )");

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {

}

}

2.配置测试环境

AndroidManifest.xml

3.PersonDao.java(实现增删查改的方法)

packagecom.amos.android_db.dao;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.util.Log;importcom.amos.android_db.MyDBHelper;importjava.util.ArrayList;importjava.util.List;/*** Created by amosli on 14-6-12.*/

public classPersonDao {privateContext context;

MyDBHelper dbHelper;publicPersonDao(Context context) {this.context =context;

dbHelper= newMyDBHelper(context);

}/*** 添加一条记录*/

public void add(String name, intage) {

SQLiteDatabase db=dbHelper.getWritableDatabase();if(db.isOpen()) {

ContentValues values= newContentValues();

values.put("age", age);

values.put("name", name);//不允许插入一个空值,如果contentvalue,一般第二个参

db.insert("person", null, values);//通过组拼完成的添加的操作

}

db.close();

}

}

1)测试add方法:

packagecom.amos.android_db.test;importandroid.test.AndroidTestCase;importcom.amos.android_db.dao.PersonDao;/*** Created by amosli on 14-6-13.*/

public class TestPersonDao extendsAndroidTestCase{public void testAdd() throwsException{

PersonDao personDao= new PersonDao(this.getContext());

personDao.add("amosli",10);

personDao.add("amosli",10);for(int i=0;i<10;i++){

personDao.add("amos"+i,10+i);

}

}

}

查看结果:

打开新创建的数据库sqlitedb

./adb shell

#cd/data/data/com.amos.android_db/databases

#lssqlitedb

# sqlite3 sqlitedb

SQLite version3.6.22Enter".help" forinstructions

Enter SQL statements terminated with a";"sqlite>.databaseseq name file

--- --------------- ----------------------------------------------------------

0 main /data/data/com.amos.android_db/databases/sqlitedb

sqlite>.table

android_metadata person

查看写入的值:

sqlite> select *from person;1|amosli|10

2|amosli|10

3|amos0|10

4|amos1|11

5|amos2|12

6|amos3|13

7|amos4|14

8|amos5|15

9|amos6|16

10|amos7|17

11|amos8|18

12|amos9|19

2)删除数据

delete方法,主要是调用了SQLiteDatabase的delete方法.其实质上也是在拼sql语句.

public voiddelete(String name) {

SQLiteDatabase db=dbHelper.getWritableDatabase();if(db.isOpen()) {

db.delete("person", "name=?", newString[]{name});

db.close();

}

}

测试delete方法:

public void testDelete() throwsException{

PersonDao personDao= new PersonDao(this.getContext());

personDao.delete("amosli");

}

查看结果:

sqlite> select *from person;3|amos0|10

4|amos1|11

5|amos2|12

6|amos3|13

7|amos4|14

8|amos5|15

9|amos6|16

10|amos7|17

11|amos8|18

12|amos9|19

3)更新数据

public void update(String name, String newname, intnewage) {

SQLiteDatabase db=dbHelper.getWritableDatabase();if(db.isOpen()) {

ContentValues contentValues= newContentValues();

contentValues.put("name", newname);

contentValues.put("age", newage);

db.update("person", contentValues, "name=?", newString[]{name});

db.close();

}

}

测试方法:

public void testUpdate() throwsException{

PersonDao personDao= new PersonDao(this.getContext());

personDao.update("amos0","0amos",35);

}

查看结果:

sqlite> select *from person;3|0amos|35

4|amos1|11

5|amos2|12

6|amos3|13

7|amos4|14

8|amos5|15

9|amos6|16

10|amos7|17

11|amos8|18

12|amos9|19

4)查找数据

public booleanfind(String name) {boolean status_result = false;

SQLiteDatabase db=dbHelper.getReadableDatabase();//public android.database.Cursor query(//String table,//String[] columns,//String selection,//String[] selectionArgs,//String groupBy,//String having,//String orderBy)

if(db.isOpen()) {

Cursor cursor= db.query("person", null, "name=?", new String[]{name}, null, null, null);if(cursor.moveToFirst()) {

status_result= true;

}

cursor.close();

db.close();

}returnstatus_result;

}

测试方法:

public void testFind() throwsException{

PersonDao personDao= new PersonDao(this.getContext());

assertEquals(true,personDao.find("amos1"));

}

5)查找所有数据

public ListfindAll(){

List persons = null;

SQLiteDatabase db=dbHelper.getReadableDatabase();if(db.isOpen()){

persons= new ArrayList();

Cursor cursor= db.query("person", null, null, null, null, null, null);while(cursor.moveToNext()){

Person person= newPerson();

person.setName(cursor.getString(cursor.getColumnIndex("name")));

person.setAge(cursor.getInt(cursor.getColumnIndex("age")));

persons.add(person);

}

cursor.close();

db.close();

}returnpersons;

}

测试方法:

public void testFindAll() throwsException{

PersonDao personDao= newPersonDao(getContext());

List personList =personDao.findAll();for(Person person:personList){

Log.d("person:",person.toString());

}

}

输出结果:

769abd8608efe71efc43856aa9b35c14.png

4.扩展--SQLite中的事务

这里以amos1向amos2转钱200元为例:

1),amos1账户初始1000元,amos2账户初始0元.

2),从amos1中减去200元,amos2中加上200元,这两个步骤要么同时成功,要么同时失败,不能一方成功,另一主失败,这就是事务.

代码实现:

packagecom.amos.android_db;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;/*** Created by amosli on 14-6-12.*/

public class MyDBHelper extendsSQLiteOpenHelper{

publicMyDBHelper(Context context) {super(context, "sqlitedb", null, 2);

}/*** 数据库第一次创建的时候调用此方法

*@paramdb*/@Overridepublic voidonCreate(SQLiteDatabase db) {

db.execSQL("create table if not exists person (personid integer primary key autoincrement ,name varchar(30) ,age integer(3) )");

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {

db.execSQL("alter table person add account integer null");

}

}

在初始化时更新表的结构,添加account一列,用来表示账户余额.

在PersonDao中添加如下方法:

public voidtransferMoney() {

SQLiteDatabase db=dbHelper.getWritableDatabase();if(db.isOpen()){try{

db.beginTransaction();//给amos1账户里设置1000元,amost account=0;

db.execSQL("update person set account=? where name = ?",new Object[]{1000,"amos1"});

db.execSQL("update person set account=? where name = ?",new Object[]{0,"amos2"});//从amos1账户里扣除200元

db.execSQL("update person set account=account-? where name = ?",new Object[]{200,"amos1"});//把amos1的钱转给amos2

db.execSQL("update person set account=account+? where name=?",new Object[]{200,"amos2"});

}catch(Exception e){

e.printStackTrace();

}finally{//显示的设置数据事务是否成功

db.setTransactionSuccessful();

db.endTransaction();

db.close();

}

}

}

和hibernate里的事务调用很类似,这里先beginTransaction,然后要注意的是setTransactionSuccessful和endTransaction.

测试方法:

public void testTransaction() throwsException{

PersonDao personDao= newPersonDao(getContext());

personDao.transferMoney();

}

测试结果:

sqlite> select *from person;3|0amos|35|

4|amos1|11|800

5|amos2|12|200

6|amos3|13|

7|amos4|14|

8|amos5|15|

9|amos6|16|

10|amos7|17|

11|amos8|18|

12|amos9|19|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlserver2000给账户授予所有的权限_你的位置信息权限设置对了么?

位置信息权限是众多应用权限中的一种&#xff0c;是应用获取手机地理位置信息的必要凭证。在你首次安装应用并打开时&#xff0c;通常会出现一连串的权限弹框&#xff0c;如果该应用在其运行过程中会用到你的地理位置信息&#xff0c;那么这些弹框中就会包含一个与位置信息有关…

Python之路,Day1 - Python基础1

本节内容 Python介绍发展史Python 2 or 3?安装Hello World程序变量用户输入模块初识.pyc是个什么鬼&#xff1f;数据类型初识数据运算表达式if ...else语句表达式for 循环break and continue 表达式while 循环作业需求 一、 Python介绍 python的创始人为吉多范罗苏姆&#xf…

mysql 范式化_MySQL-范式和反范式

1.第一范式(1NF)(列不能再拆分)原子性&#xff0c;字段不可分(列的信息)&#xff0c;只要是关系型数据库&#xff0c;就自动满足1NF&#xff1b;2.第二范式(2NF)(主键唯一&#xff0c;且被依赖)在第一范式基础上建立的&#xff0c;即满足第二范式的必须先满足第一范式。要求DB表…

java 判断是否是list_JAVA从头开始一基础梳理(4-3)

大家好&#xff0c;今天我们介绍一下java中常用的集合类型。首先&#xff0c;我们先看一下java中集合类型的结构。以上是集合的继承关系图&#xff0c;通常我们使用的比较多的是 Set , List , Map以及其衍生的子类和接口实现类。首先给大家介绍一下List&#xff0c;List本身是一…

前端网页广告无线翻滚_从小白到web前端工程师进阶之路 从0到1到更深

互联网的发展&#xff0c;让web前端技术发生了翻天覆地的变化&#xff0c;前端开发工程师可以让网页内容变得更加生动&#xff0c;为用户带来更好的体验。那么&#xff0c;武汉web前端培训哪个好&#xff1f;web前端好学吗&#xff1f;作为一个合格的Web前端工程师&#xff0c;…

判读一个对象不为空_ArrayList实现分析(一)——对象创建

ArrayList是java中最常用的集合类之一&#xff0c;它的内部实现是基于数组&#xff0c;因此ArryList可以根据索引实现随机访问。ArryList继承了AbstractList类&#xff0c;并且实现了List, RandomAccess, Cloneable接口。下面详细分析一下ArrayList的实现&#xff0c;下面的分析…

AngularJS与Angular的区别

指同一事物&#xff0c;版本的区别&#xff0c;叫法不同 Angular2.0之前的版本&#xff08;1.x&#xff09;叫做AngularJS 1.x的使用是引入AngularJS的js文件到网页。 2.0之后&#xff0c;就是完全不同了。 Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是…

网页控制台调用click()失败_C# 调用百度AI 人脸识别

一、设置登录百度云控制台&#xff0c;添加应用-添加人脸识别&#xff0c;查找&#xff0c;对比等。设置人脸识别应用记住API Key和Secret Key二、创建Demo程序1、使用Nuget安装 Baidu.AI 和 Newtonsoft.JsonNuget2、直接下载SDK https://ai.baidu.com/file/7D961BC013AB4AA790…

mysql查看服务器CPU和内存_怎么查看服务器的cpu和内存的硬件信息

可以按照如下方式进行操作&#xff1a;一、查看cpu总个数方法&#xff1a;1、首先执行top命令&#xff0c;如下图中内容所表示。2、在top命令的显示界面&#xff0c;按数字键1&#xff0c;即可查看到当前系统中的总cpu数&#xff0c;如下图中内容所表示。二、查看总内存的方法&…

极光推送指定用户推送_干货|SpringBoot集成极光推送完整实现代码(建议收藏)...

工作中经常会遇到服务器向App推送消息的需求&#xff0c;一般企业中选择用极光推送的比较多&#xff0c;在集成极光时发现极光的文档并不完整&#xff0c;网上的文章也很多不能直接使用&#xff0c;这里列出我在工作中集成极光的全部代码&#xff0c;只需要按照如下代码保证一次…

Babylon-AST初探-代码更新删除(Update Remove)

通过前两篇文章的介绍&#xff0c;大家已经了解了Create和Retrieve&#xff0c;我们接着介绍Update和 Remove操作。Update操作通常配合Create来完成。我们这篇文章主要介绍几个常用的NodePathAPI&#xff1a;replace、insert、remove。具体也可以看babel-handbook中的Manipulat…

编解码异常分析

前言 最近在做的项目&#xff0c;有H264解码的需求。部分H264文件解码播放后&#xff0c;显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

js根据name获取value_js 函数的重载

js 函数的重载我们知道&#xff0c;很多编程语言都有函数的重载。所谓的重载&#xff0c;看定义&#xff1a;重载&#xff0c;简单说&#xff0c;就是函数或者方法有相同的名称&#xff0c;但是参数列表不相同的情形&#xff0c;这样的同名不同参数的函数或者方法之间&#xff…

存储过程循环遍历一个月的每一天的函数_JavaScript 循环:如何处理 async/await

同步循环很久以前我写的循环是这样的&#xff1a;后来 JavaScript 提供了很多新的特性&#xff0c;现在我们会更倾向于用下面这种写法&#xff1a;在开发过程可能会有这么一种需求&#xff0c;我们需要在循环中异步处理 item&#xff0c;那么可以怎么做呢&#xff1f;异步循环如…

Angular程序架构

component&#xff0c;组件是Angular应用的基本构建块&#xff0c;你可以把一个组件理解为一段带有业务逻辑和数据的html。组件下面可以有子组件&#xff0c;子组件下有孙子组件&#xff0c;像树一样。指令&#xff1a;允许你向html元素添加自定义行为。模块Ngmodule&#xff1…

易语言python1.1模块_易语言之编写模块与引入模块

本人并不精通易语言&#xff0c;只是对其进行一定了解后做一个简单的总结。直接新建一个易语言模块&#xff0c;然后添加子程序即可。子程序当然可以随意命名&#xff0c;实际上&#xff0c;易语言的子程序就和c语言的函数&#xff0c;java中的方法一样(实际上&#xff0c;java…

spring boot开发笔记——mybatis

概述 mybatis框架的优点&#xff0c;就不用多说了&#xff0c;今天这边干货主要讲mybatis的逆向工程&#xff0c;以及springboot的集成技巧&#xff0c;和分页的使用 因为在日常的开发中&#xff0c;当碰到特殊需求之类会手动写一下sql语句&#xff0c;大部分的时候完全可以用m…

Angular项目目录介绍

通过 ng new 项目名生成的项目 一级目录 Angular cli 工具生成的目录文件名不要随意修改&#xff0c;要不然会影响工具的使用。e2e&#xff1a;端到端的测试目录&#xff0c;用来做自动测试的。node_modules&#xff1a;Angular第三方包。src&#xff1a;应用源代码目录&#…

jvm内存模型_四种视角看JVM内存模型

1.JVM运行视角程序计数器Java虚拟机栈本地方法栈Java堆方法区1 .程序计数器程序计数器是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的行号指示器。这个计数器记录的是正在执行的虚拟机字节码指令的地址。此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何Ou…

Tomcat服务脚本

为什么80%的码农都做不了架构师&#xff1f;>>> #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # S…