数据库事务课上代码

package com.example.wang.testapp3;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class TestActivity2 extends AppCompatActivity {

    EditText et_id,et_name,et_sex,et_age;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test2);

        et_id=(EditText)findViewById(R.id.et_id);
        et_name=(EditText)findViewById(R.id.et_name);
        et_sex=(EditText)findViewById(R.id.et_sex);
        et_age=(EditText)findViewById(R.id.et_age);
    }

    //初始化数据库
    public void bt1_OnClick(View v)
    {
        //使用工具类得到数据库对象
        MyDBHelper myDBHelper=new MyDBHelper("test.db",1);

        //得到连接
        SQLiteDatabase sd = myDBHelper.getReadableDatabase();

        Toast.makeText(TestActivity2.this, "连接数据库成功", Toast.LENGTH_SHORT).show();

        //关闭连接
        sd.close();
    }

    //初始化数据库
    public void bt2_OnClick(View v)
    {
        //使用工具类得到数据库对象
        MyDBHelper myDBHelper=new MyDBHelper("test.db",2);

        //得到连接
        SQLiteDatabase sd = myDBHelper.getReadableDatabase();

        Toast.makeText(TestActivity2.this, "连接数据库成功", Toast.LENGTH_SHORT).show();

        //关闭连接
        sd.close();
    }

    //插入新数据
    public  void  bt3_OnClick(View v)
    {
        //1-连接数据库,得到数据库连接对象

        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();
        //2-准备数据

        ContentValues cv=new ContentValues();

        cv.put("name",et_name.getText().toString());

        cv.put("sex",et_sex.getText().toString());

        cv.put("age",et_age.getText().toString());

        //3-调用insert(),插入数据
        Long l=sd.insert("t_user", null, cv);

        Toast.makeText(TestActivity2.this, "插入数据的主键="+l, Toast.LENGTH_SHORT).show();

        //4-关闭连接
        sd.close();
    }


    //数据查询
    public  void  bt4_OnClick(View v)
    {

        //1.得到连接
        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();

        //2.全表查询
        Cursor c=sd.query("t_user", null, null, null, null, null, null);

        //3.遍历结果集
        while (c.moveToNext())
        {
            //读取数据
            String str="_id="+c.getLong(0)+" name="+c.getString(1)+
                    " sex="+c.getString(2)+" age="+c.getInt(3);

            Log.e("TAG",str);
        }


        Toast.makeText(TestActivity2.this, "结果集的记录条数="+ c.getCount(), Toast.LENGTH_SHORT).show();

        c.close();

        //4.关闭连接
        sd.close();

    }


    //带条件数据查询
    public  void  bt5_OnClick(View v)
    {

        //1.得到连接
        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();

        String strWhere="1=1";

        //得到条件
        if (et_id.getText().length()>0)
        {
            strWhere+="and _id="+et_id.getText().toString();
        }


        if (et_name.getText().length()>0)
        {
            strWhere+=" and name like '%"+et_name.getText().toString()+"%'";
        }

        if (et_sex.getText().length()>0)
        {
            strWhere+=" and sex = '"+et_sex.getText().toString()+"'";
        }

        if (et_age.getText().length()>0)
        {
            strWhere+=" and age = "+et_age.getText().toString()+"";
        }

        //2.全表查询
        Cursor c=sd.query("t_user", null, strWhere, null, null, null, null);

        //3.遍历结果集
        while (c.moveToNext())
        {
            //读取数据
            String str="_id="+c.getLong(0)+" name="+c.getString(1)+
                    " sex="+c.getString(2)+" age="+c.getInt(3);

            Log.e("TAG",str);

        }


        Toast.makeText(TestActivity2.this, "结果集的记录条数="+ c.getCount(), Toast.LENGTH_SHORT).show();

        c.close();

        //4.关闭连接
        sd.close();

    }

    //修改数据
    public  void  bt6_OnClick(View v)
    {

        //1.得到连接
        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();

        //修改
        ContentValues cv=new ContentValues();
        cv.put("name", et_name.getText().toString());

        cv.put("sex", et_sex.getText().toString());

        cv.put("age", et_age.getText().toString());
        int i= sd.update("t_user", cv, "_id=?", new String[]{et_id.getText().toString()});

        Toast.makeText(TestActivity2.this, "修改的记录条数="+i, Toast.LENGTH_SHORT).show();

        //4.关闭连接
        sd.close();

    }

    //删除数据
    public  void  bt7_OnClick(View v)
    {

        //1.得到连接
        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();

      //2.删除

       int i=  sd.delete("t_user", "_id=?", new String[]{et_id.getText().toString()});
        Toast.makeText(TestActivity2.this, "删除的记录条数="+i, Toast.LENGTH_SHORT).show();

        //4.关闭连接
        sd.close();

    }


    //数据库事务
    public  void  bt8_OnClick(View v)
    {
        SQLiteDatabase sd = new MyDBHelper("test.db",2).getReadableDatabase();
        try {
        //1.得到连接


        sd.beginTransaction();//1-启动事务

        //修改
        ContentValues cv=new ContentValues();
        cv.put("age", "44");
        //修改1
        int i= sd.update("t_user", cv, "_id=1", null);

        //抛出异常
        if (i>0)
        {
            throw new RuntimeException("模拟事务异常");
        }

        ContentValues cv1=new ContentValues();
        cv1.put("age", "54");
        //修改2
        int k= sd.update("t_user", cv1, "_id=2", null);

        Toast.makeText(TestActivity2.this, "修改的记录条数="+(i+k), Toast.LENGTH_SHORT).show();

        //设置事务是成功完成的
        sd.setTransactionSuccessful();


        //结束事务
        //1.没有异常,提交事务
        //2.发生异常,回滚事务

        }
        catch (Exception e)
        {
              e.printStackTrace();
            Toast.makeText(TestActivity2.this, "修改出错", Toast.LENGTH_SHORT).show();
        }
        finally {
            //一定会被执行的代码
            sd.endTransaction();

            //4.关闭连接
            sd.close();
        }

    }



    //实现SQLiteOpenHelper的内部类
    class MyDBHelper extends SQLiteOpenHelper
    {
        //构造方法
        public  MyDBHelper(String dbname,int ver)
        {
            //显示调用父类的构造方法
            //必须在第一行
            super(TestActivity2.this,dbname,null,ver);
        }
        //创建和初始化数据库
        @Override
        public void onCreate(SQLiteDatabase db) {

            //1-执行创建数据库的语句

            String sql="CREATE TABLE t_user" + " ("_id"  INTEGER AUTOINCREMENT NOT NULL," +
                    ""name"  VARCHAR(20) NOT NULL," +
                    ""sex"  CHAR(1)," +
                    ""age"  INTEGER," +
                    "PRIMARY KEY ("_id"))";
            db.execSQL(sql);

            Log.e("TAG","表创建成功");
            //2-执行初始化数据的语句,insert语句
            ContentValues cv = new ContentValues();

            cv.put("name","张三");
            cv.put("sex","男");
            cv.put("age", 20);

            //执行插入
            Long l=db.insert("t_user", null, cv);
            Log.e("TAG", "初始化数据=" + l);
        }

        //升级数据库
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            //修改数据
            if(newVersion==2)
            {
                ContentValues cv=new ContentValues();

                cv.put("name","李四");

                String sql="update t_user set name='李四' where _id=1";

                //调用数据库连接类的方法

                String[] str={"1","18"};
                int i=db.update("t_user", cv, "_id=? and age>?",str);

                Log.e("TAG","升级数据 数据条数="+i);
            }


        }


    }
}
java
<?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"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.wang.testapp3.TestActivity2"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="初始化数据库"
        android:onClick="bt1_OnClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="升级数据库"
        android:onClick="bt2_OnClick"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="id"
            android:id="@+id/et_id"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="name"
            android:id="@+id/et_name"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="sex"
            android:id="@+id/et_sex"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="age"
            android:id="@+id/et_age"/>
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新增数据"
        android:onClick="bt3_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="数据全部查询"
        android:onClick="bt4_OnClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="带条件查询数据"
        android:onClick="bt5_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改数据"
        android:onClick="bt6_OnClick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据"
        android:onClick="bt7_OnClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="数据库事务"
        android:onClick="bt8_OnClick"/>




</LinearLayout>
xml
原文地址:https://www.cnblogs.com/wangchuanqi/p/5561496.html