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.pswp.cn/news/538554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538554.shtml
英文地址,請注明出處:http://en.pswp.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;---------------…