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

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

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

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


1.创建DB工具类

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


package com.amos.android_db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* Created by amosli on 14-6-12.
*/
public class MyDBHelper extends SQLiteOpenHelper{
/**
*
* @param context
*/
public MyDBHelper(Context context) {
super(context, "sqlitedb", null, 1);
}

/**
* 数据库第一次创建的时候调用此方法
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists person (personid integer primary key autoincrement ,name varchar(30) ,age integer(3) )");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

2.配置测试环境


AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amos.android_db"
android:versionCode="1"
android:versionName="1.0">
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.amos.android_db"/>

<uses-sdk android:minSdkVersion="7"/>
<application android:label="@string/app_name">
<uses-library android:name="android.test.runner"/>
<activity android:name="MyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

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


package com.amos.android_db.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.amos.android_db.MyDBHelper;

import java.util.ArrayList;
import java.util.List;

/**
* Created by amosli on 14-6-12.
*/
public class PersonDao {
private Context context;
MyDBHelper dbHelper;

public PersonDao(Context context) {
this.context = context;
dbHelper = new MyDBHelper(context);
}

/**
* 添加一条记录
*/
public void add(String name, int age) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
if (db.isOpen()) {
ContentValues values = new ContentValues();
values.put("age", age);
values.put("name", name);
//不允许插入一个空值,如果contentvalue,一般第二个参
db.insert("person", null, values);//通过组拼完成的添加的操作
}
db.close();
}

}

1)测试add方法:


package com.amos.android_db.test;

import android.test.AndroidTestCase;
import com.amos.android_db.dao.PersonDao;

/**
* Created by amosli on 14-6-13.
*/
public class TestPersonDao extends AndroidTestCase{

public void testAdd() throws Exception{
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
# ls
sqlitedb
# sqlite3 sqlitedb
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .database
seq 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 void delete(String name) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
if (db.isOpen()) {
db.delete("person", "name=?", new String[]{name});
db.close();
}
}

测试delete方法:

 public void testDelete() throws Exception{
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, int newage) {
SQLiteDatabase db = dbHelper.getWritableDatabase();

if (db.isOpen()) {
ContentValues contentValues = new ContentValues();
contentValues.put("name", newname);
contentValues.put("age"
, newage);
db.update("person", contentValues, "name=?", new String[]{name});
db.close();
}
}

测试方法:

 public void testUpdate() throws Exception{
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 boolean find(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();
}
return status_result;
}

测试方法:

public void testFind() throws Exception{
PersonDao personDao = new PersonDao(this.getContext());
assertEquals(true,personDao.find("amos1"));
}

5)查找所有数据


 public List<Person> findAll(){
List<Person> persons = null;
SQLiteDatabase db = dbHelper.getReadableDatabase();
if(db.isOpen()){
persons = new ArrayList<Person>();

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

while(cursor.moveToNext()){
Person person = new Person();
person.setName(cursor.getString(cursor.getColumnIndex("name")));
person.setAge(cursor.getInt(cursor.getColumnIndex("age"
)));
persons.add(person);
}

cursor.close();
db.close();
}
return persons;
}

测试方法:


   public void testFindAll() throws Exception{
PersonDao personDao = new PersonDao(getContext());
List<Person> personList = personDao.findAll();
for(Person person:personList){
Log.d("person:",person.toString());
}

}

输出结果:

4.扩展--SQLite中的事务


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

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

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

代码实现:


package com.amos.android_db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* Created by amosli on 14-6-12.
*/
public class MyDBHelper extends SQLiteOpenHelper{

public MyDBHelper(Context context) {
super(context, "sqlitedb", null, 2);
}

/**
* 数据库第一次创建的时候调用此方法
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists person (personid integer primary key autoincrement ,name varchar(30) ,age integer(3) )");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table person add account integer null");
}
}

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

在PersonDao中添加如下方法:


 public void transferMoney() {
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() throws Exception{
PersonDao personDao = new PersonDao(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|

本文源码:https://github.com/amosli/android_basic/tree/android_db

 

Android学习---SQLite数据库的增删改查和事务(transaction)调用,布布扣,bubuko.com

时间: 2024-10-14 03:34:09

Android学习---SQLite数据库的增删改查和事务(transaction)调用的相关文章

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

Android下利用SQLite数据库实现增删改查

1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3:  sqlite3 数据库 4   接下来就可以进行数据库的sql语法的使用了 bean对象: public class Person { private int id; private String name; private String number; } 数据库的创建以及表的创建: package com.example.db; import android.

[Android] SQLite数据库之增删改查基础操作

    在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Unix等主流操作系统,同一时候可以跟非常多程序语言如C#.PHP.Java等相结合.以下先回想SQL的基本语句,再讲述Android的基本操作. 一. adb shell回想SQL语句     首先,我感觉自己整个大学印象最深的几门课就包含<数据库>,所以想先回想SQL增删改查的基本语句.而在And

【Android基础篇】SQLite数据库的增删改查基本操作

一.概述 SQLite是Android系统的核心数据存储服务之一,它是一个轻型的嵌入式数据库,占用非常少的资源却能提供很好很快的数据存取服务,许多大型的需要数据存储的Android项目都有用到SQLite(也可以用于桌面应用程序). 下面介绍一下SQLite的创建数据库.表的操作,以及基本的增删改查操作. 二.基本操作API简介 在Android中,SQLiteDatabase类提供了SQLite的底层API,但在使用SQLite数据库时,我们往往不会直接操作SQLiteDatabase这个类,

andorid SQLite数据库的增删改查

.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent&qu

MySQL学习——操作数据库(增删改查)(一)

数据库是长期存储在计算机内,有组织的和可共享的数据集合,简而言之,数据库就是一个存储数据的地方,只是在其存储方式有特定的规律,这样做可以方便处理数据,数据库的操作包括创建数据库和删除数据库,还有数据库中的查询与修改,这些操作都是数据库管理的基础. 一,创建数据库 创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据,这是进行表操作的基础,也是进行数据库管理的基础,在mysql中创建数据库需要通过SQL语句CREATE DATABASES实现,语法形式如下: CREATE DATABASE

spring框架学习之--数据库操作增删改查

基于spring的NamedParameterJdbcTemplate操作数据库 首先在 resources 文件夹下添加数据库配置文件jdbc.properties 配置常用的数据库信息 1 consult.jdbc.driverClassName=com.mysql.jdbc.Driver 2 consult.jdbc.url=jdbc:mysql://xxxxxxxx:3307/consult_summer?useUnicode=true&characterEncoding=utf-8&am

Android实现SQLite数据库的增、删、改、查的操作

核心代码DAO类 package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import

MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4085684.html 联系方式:[email protected] [正文] 这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续. 我们在之前的几篇文章中学习了JDBC对数据库的增删改查.其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的