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.
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .database
seq name file
--- --------------- ----------------------------------------------------------
main /data/data/com.amos.android_db/databases/sqlitedb
sqlite> .table
android_metadata person
查看写入的值:
sqlite> select * from person;
|amosli|
|amosli|
|amos0|
|amos1|
|amos2|
|amos3|
|amos4|
|amos5|
|amos6|
|amos7|
|amos8|
|amos9|
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;
|amos0|
|amos1|
|amos2|
|amos3|
|amos4|
|amos5|
|amos6|
|amos7|
|amos8|
|amos9|
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;
|0amos|
|amos1|
|amos2|
|amos3|
|amos4|
|amos5|
|amos6|
|amos7|
|amos8|
|amos9|
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;
|0amos||
|amos1||
|amos2||
|amos3||
|amos4||
|amos5||
|amos6||
|amos7||
|amos8||
|amos9||
本文源码:https://github.com/amosli/android_basic/tree/android_db
Android学习---SQLite数据库的增删改查和事务(transaction)调用的更多相关文章
- Android中Sqlite数据库进行增删改查
今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...
- android 对sqlite数据库的增删改查等各种操作
转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...
- Android对Sqlite数据库的增删改查
SqLite 数据库 Google 为我们提供了sqlite相关的api SqLiteOpenHelper 这是一个抽象的类 如果想要使用的话,需要其他的类去继承他 SqLiteDatabase 类 ...
- andorid SQLite数据库的增删改查 和事务操作
.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- Android下利用SQLite数据库实现增删改查
1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3: sqlite3 数据库 4 接下来就可以进行数据库的sql语法 ...
- [Android] SQLite数据库之增删改查基础操作
在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Un ...
- greendao对SQLite数据库的增删改查操作
利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...
- SQLite数据库以及增删改查的案例
Android使用开源的与操作系统无关的SQL数据库——SQLite 一:在命令行下创建数据库: 1.启动模拟器后,打开命令行,执行adb shell 2.进入所在工程目录 3.执行sqlite3 m ...
- Android,java,php开发最基本的知识,mysql sqlite数据库的增删改查代理,sql语句
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985转载请说明出处. 下面是代码: 增加:insert into 数据表(字段1,字段2,字段3) valu ...
随机推荐
- java.lang.OutOfMemoryError: Java heap space解决办法
进入到tomcat/bin目录下,编辑catalina.bat,在这个文件最前面加入一句:set JAVA_OPTS=-Xms384m -Xmx384m 保存退出,重启tomcat服务即可. 该异常应 ...
- 【练习】oracel获取当前session的id方法
1. :: SYS; SID ---------- 2. :: SYS@ORA11GR2>SELECT USERENV('SID') FROM DUAL; USERENV('SID') ---- ...
- org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [41] did not match expected type [java.lang.Integer (n/a)];
题记:以前记录过一些自己遇到的BUG,这个行为,让我一看报错的提示信息就能定位到问题的所在,后来记得比较多了,好多是重复性的再加上比较忙就没有详细的记录了,今天的工作量比较小,就顺便记录一下,以便以后 ...
- 17.linux下root用户与普通用户
默认安装完成之后并不知道root用户的密码,那么如何应用root权限呢? (1)sudo 命令 这样输入当前管理员用户密码就可以得到超级用户的权限.但默认的情况下5分钟root权限就失效了. (2 ...
- STL迭代器之二:迭代器型别
如果一个迭代器要兼容stl,必须遵循约定,自行以内嵌型别定义的方式定义出相应型别.根据书中介绍,最常用到的迭代器型别有五种:value type,difference type, pointer, r ...
- RabbitMQ学习: 介绍
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...
- [转载]我的WCF之旅(1):创建一个简单的WCF程序
为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...
- php使用curl简单抓取远程url的方法
这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php使用curl抓取远程url的方法.分 ...
- Portable Basemap Server:多数据源多客户端的底图服务器
Portable Basemap Server:多数据源多客户端的底图服务器 [poll id=”1″]2014.3.8更新v3.1~在线切片转换为MBTiles时,增加RecreateEmptyCa ...
- 【网络编程/C++】修改本机ip地址
昨天学会了编程实现获取本地网卡信息,今天再接再砺学会了修改本机ip地址.其实原理很简单就是用c++调用一下dos命令而已,不得不说,dos命令实在是太强大了,当然听说还有种修改注册表的方法,不过没有试 ...