Android中数据库事务处理

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。使用例子如下:

SQLiteDatabase db = ....;db.beginTransaction();//开始事务try {    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});    db.execSQL("update person set name=? where personid=?", new Object[]{"传智", 1});    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务} finally {    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务} db.close(); 

上面两条SQL语句在同一个事务中执行。

1:Person 类

package cn.itcast.domain;public class Person {private Integer id;private String name;private Integer amount;public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}public Person(){}public Person(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [amount=" + amount + ", id=" + id + ", name=" + name+ "]";}}

2:DBOpenHelper类

package cn.itcast.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {private static final String DATABASENAME = "itcast.db"; //数据库名称private static final int DATABASEVERSION = 2;//数据库版本public DBOpenHelper(Context context) {super(context, DATABASENAME, null, DATABASEVERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), amount integer)");//执行有更改的sql语句}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS person");onCreate(db);}}

3(1):通过SQlite访问方法一:PersonService类

package cn.itcast.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import cn.itcast.domain.Person;public class PersonService {private DBOpenHelper dbOpenHelper;public PersonService(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}public void payment(){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.beginTransaction();//事启事务try{db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});db.setTransactionSuccessful();//设置事务标志为成功,当结束事务时就会提交事务}finally{db.endTransaction();}}public void save(Person person){//如果要对数据进行更改,就调用此方法得到用于操作数据库的实例,该方法以读和写方式打开数据库SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("insert into person (name,amount) values(?,?)",new Object[]{person.getName(),person.getAmount()});}public void update(Person person){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("update person set name=? where personid=?", new Object[]{person.getName(),person.getId()});}public void delete(Integer id){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("delete from person where personid=?", new Object[]{id.toString()});}public Person find(Integer id){//如果只对数据进行读取,建议使用此方法SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]{id.toString()});if(cursor.moveToFirst()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));Person person = new Person(personid, name);person.setAmount(amount);return person;}return null;}public List<Person> getScrollData(Integer offset, Integer maxResult){List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person limit ?,?",new String[]{offset.toString(), maxResult.toString()});while(cursor.moveToNext()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));Person person = new Person(personid, name);person.setAmount(amount);persons.add(person);}cursor.close();return persons;}public Cursor getCursorScrollData(Integer offset, Integer maxResult){SQLiteDatabase db = dbOpenHelper.getReadableDatabase();return db.rawQuery("select personid as _id, name, amount from person limit ?,?",new String[]{offset.toString(), maxResult.toString()});}public long getCount() {SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select count(*) from person", null);cursor.moveToFirst();return cursor.getLong(0);}}

3(2)数据增删改查之测试:PersonServiceTest

package cn.itcast.db;import java.util.List;import cn.itcast.domain.Person;import cn.itcast.service.DBOpenHelper;import cn.itcast.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase {private static final String TAG = "PersonServiceTest";public void testCreateDB() throws Throwable{DBOpenHelper dbOpenHelper = new DBOpenHelper(this.getContext());dbOpenHelper.getWritableDatabase();//第一次调用该方法就会创建数据库}public void testSave() throws Throwable{PersonService personService = new PersonService(this.getContext());Person person = new Person();person.setName("xiaoxiao");person.setAmount(100);personService.save(person);person = new Person();person.setAmount(50);person.setName("zhangliming");personService.save(person);person = new Person();person.setAmount(45);person.setName("libaobao");personService.save(person);person = new Person();person.setAmount(190);person.setName("taobao");personService.save(person);}public void testUpate() throws Throwable{PersonService personService = new PersonService(this.getContext());Person person = personService.find(1);person.setName("lili");personService.update(person);}public void testDelete() throws Throwable{PersonService personService = new PersonService(this.getContext());personService.delete(1);}public void testFind() throws Throwable{PersonService personService = new PersonService(this.getContext());Person person = personService.find(1);Log.i(TAG, person.toString());}public void testGetScrollData() throws Throwable{PersonService personService = new PersonService(this.getContext());List<Person> persons = personService.getScrollData(0, 30);for(Person person : persons){Log.i(TAG, person.toString());}}public void testGetCount() throws Throwable{PersonService personService = new PersonService(this.getContext());Log.i(TAG, personService.getCount()+"");}public void testPayment() throws Throwable{PersonService personService = new PersonService(this.getContext());personService.payment();}}

4(1):通过SQlite访问方法二:PersonService类

package cn.itcast.service;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 cn.itcast.domain.Person;public class OtherPersonService {private DBOpenHelper dbOpenHelper;public OtherPersonService(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}public void save(Person person){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", person.getName());db.insert("person", null, values);}public void update(Person person){// update person set name =? where personid =?SQLiteDatabase db = dbOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", person.getName());db.update("person", values, "personid=?", new String[]{person.getId().toString()});}public void delete(Integer id){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.delete("person", "personid=?", new String[]{id.toString()});}public Person find(Integer id){//如果只对数据进行读取,建议使用此方法SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.query("person", new String[]{"personid", "name"},"personid=?", new String[]{id.toString()}, null, null, null);//select personid,name from person where personid=? order by ... limit 3,5if(cursor.moveToFirst()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));return new Person(personid, name);}return null;}public List<Person> getScrollData(Integer offset, Integer maxResult){List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.query("person", null, null, null, null, null, null, offset+","+ maxResult);while(cursor.moveToNext()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));Person person = new Person(personid, name);persons.add(person);}cursor.close();return persons;}public long getCount() {// select count(*) from personSQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.query("person", new String[]{"count(*)"}, null, null, null, null, null);cursor.moveToFirst();return cursor.getLong(0);}}

4(2)数据增删改查之测试:OtherPersonServiceTest

package cn.itcast.db;import java.util.List;import cn.itcast.domain.Person;import cn.itcast.service.DBOpenHelper;import cn.itcast.service.OtherPersonService;import cn.itcast.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class OtherPersonServiceTest extends AndroidTestCase {private static final String TAG = "PersonServiceTest";public void testSave() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());Person person = new Person();person.setName("xiaoxiao");personService.save(person);person = new Person();person.setName("zhangliming");personService.save(person);person = new Person();person.setName("libaobao");personService.save(person);person = new Person();person.setName("taobao");personService.save(person);}public void testUpate() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());Person person = personService.find(1);person.setName("lili");personService.update(person);}public void testDelete() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());personService.delete(1);}public void testFind() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());Person person = personService.find(1);Log.i(TAG, person.toString());}public void testGetScrollData() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());List<Person> persons = personService.getScrollData(0, 10);for(Person person : persons){Log.i(TAG, person.toString());}}public void testGetCount() throws Throwable{OtherPersonService personService = new OtherPersonService(this.getContext());Log.i(TAG, personService.getCount()+"");}}

5:事务处理与数据显示

package cn.itcast.db;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import cn.itcast.domain.Person;import cn.itcast.service.PersonService;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleCursorAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class MainActivity extends Activity {    private PersonService personService;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                this.personService = new PersonService(this);               ListView listView = (ListView) this.findViewById(R.id.listView);        Cursor cursor = personService.getCursorScrollData(0, 5);        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor,        new String[]{"_id", "name", "amount"}, new int[]{R.id.id, R.id.name, R.id.amount});        listView.setAdapter(adapter);        listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {ListView lView = (ListView)parent;Cursor data = (Cursor)lView.getItemAtPosition(position);int personid = data.getInt(data.getColumnIndex("_id"));Toast.makeText(MainActivity.this, personid+"", 1).show();}});        /*        List<Person> persons = personService.getScrollData(0, 5);        List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();        for(Person person : persons){        HashMap<String, Object> item = new HashMap<String, Object>();        item.put("id", person.getId());        item.put("name", person.getName());        item.put("amount", person.getAmount());        data.add(item);        }        SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item,        new String[]{"id", "name", "amount"}, new int[]{R.id.id, R.id.name, R.id.amount});        listView.setAdapter(adapter);                listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {ListView lView = (ListView)parent;HashMap<String, Object> item = (HashMap<String, Object>)lView.getItemAtPosition(position);Toast.makeText(MainActivity.this, item.get("id").toString(), 1).show();}});*/                Button button = (Button) this.findViewById(R.id.insertbutton);        button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ContentResolver contentResolver = getContentResolver();Uri insertUri = Uri.parse("content://cn.itcast.providers.personprovider/person");ContentValues values = new ContentValues();values.put("name", "itcastliming");values.put("amount", 100);Uri uri = contentResolver.insert(insertUri, values);Toast.makeText(MainActivity.this, "添加完成", 1).show();}});    }}

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android(安卓)Wifi模块分析(三)
  7. Android中dispatchDraw分析
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. android 仿微信5版本实现滑动导航条
  2. Android中自定义通用Json解释器
  3. Intent在Android中的几种用法 .
  4. Android Gson 解析泛型报错
  5. Android 6.0 关于WiFi的改变
  6. Android打Jar包注意事项
  7. mac下反编译android apk
  8. android 打开微信扫一扫
  9. Android 系统名字、版本、API level的对
  10. android 打开GPS的几种方式