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表…

端口被占用解决办法

1. 端口被占用解决办法 netstat -ano | findstr 8080(端口号) taskkill -pid (进程pid) –f转载于:https://www.cnblogs.com/xaoco/p/9114773.html

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

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

Python2.x还是3.x?

2.x 和 3.x对于程序员的编码来说&#xff0c;没有发生太大的变化&#xff0c;当然也是有变化的&#xff0c;主要是Python内部发生了巨变。 要用3.x的原因是&#xff1a; 1、3.x和2.x版本不兼容。 2、Python库新增的内容不支持2.x了。 3、2.x版本官方支持到2020年结束。 晚改…

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

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

PowerDesigner导出表为Excel(转)

打开脚本运行器CtrlShiftX 导出&#xff1a; ****************************************************************************** Option ExplicitDim rowsNumrowsNum 0 -----------------------------------------------------------------------------Main function -------…

判读一个对象不为空_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;如下图中内容所表示。二、查看总内存的方法&…

内核模式下的文件操作

内核模式下的文件操作 转载于:https://www.cnblogs.com/endenvor/p/9119495.html

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

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

什么是ES6?

什么是ES6&#xff1f; ECMAScript 6&#xff08;以下简称ES6&#xff09;是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上&#xff0c;推出JavaScript 2.0。   ECMAScript和JavaScript到底是什么关系&#xff1f;很多…

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

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

python中时间间隔默认单位是什么_Python时间增量(以年为单位)

你需要不止一个timedelta来说明多少年过去了&#xff1b;你还需要知道开始(或结束)日期。(这是闰年的事。)最好的方法是使用dateutil.relativedeltaobject&#xff0c;但这是第三方模块。如果您想知道从某个日期起的datetime年(默认为现在)&#xff0c;可以执行以下操作&#x…

编解码异常分析

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

python读取数据库导出文件_python如何导出excel表格数据库数据

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?

我今天遇到了同样的问题,每次触发都会导致堆栈溢出.原来我的Zend社区服务器安装附带了一个默认的my.cnf文件,其中thread_stack大小设置为128K,这导致每个线程中可用于堆栈的131072字节&#xff1a;mysql> show variables where Variable_name thread_stack;---------------…