Android——SQLite数据库(二)升级数据库、增、删、改、查、事务

 

xml

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

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库"
        android:id="@+id/bt_cjshujuku"
        android:onClick="chuangjiansjkonclick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="升级数据库"
        android:id="@+id/bt_sjshujuku"
        android:onClick="shengjisjkonclick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="增加数据"
        android:id="@+id/bt_zjshuju"
        android:onClick="zengjiasjonclick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询数据"
        android:id="@+id/bt_cxjuku"
        android:onClick="chaxunsjonclick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改数据"
        android:id="@+id/bt_xgjuku"
        android:onClick="xiugaisjonclick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据"
        android:id="@+id/bt_scjuku"
        android:onClick="shanchusjonclick"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="事务操作"
        android:id="@+id/bt_shiwucz"
        android:onClick="shiwuczonclick"/>


</LinearLayout>

java

package com.example.chenshuai.test321;

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

public class Activitydatashujuku extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activitydatashujuku);
    }

    /*操作数据库有两个非常重要的类:SQLiteDatabase和SQLiteOpenHelper
    * 1.SQLiteDatabase的实例便代表了SQLite数据库,通过SQLiteDatabase的一些常用方法,可以执行SQL语句,
    * 对数据库进行添加、删除、更新、查找和修改等操作
    * 2.SQLiteOpenHelper是一个辅助类,主要负责创建和打开数据库以及对数据库的版本进行管理。
    * SQLiteOpenHelper是一个抽象类,需要继承它并实现它的几个回调函数
    * */
   /*
    1.写内部类 继承SQLiteOpenHelper
    2.生成实现方法
      (1)创建  public void onCreate(SQLiteDatabase db) {
      (2)升级  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    3.生成器 调用父类的构造方法
     public DBHelper(String name, int version) {

    4.点击事件 调用构造方法DBHelper 创建 连接数据库
*/
    //内部类继承  需要自己生成构造器
    class DBHelper extends SQLiteOpenHelper
    {
        //构造方法
        //name 数据库名
        //version 自己定义的数据库的版本号
        public DBHelper(String name, int version) {

           //需要调用父类的构造方法 写在第一行
            super(Activitydatashujuku.this, name, null, version);
        }

        //实现方法  是一个回调方法
        //在创建数据库时调用
        //什么时候创建数据库:连接数据库的时候,如果数据库文件不存在
        //只调用一次
        @Override
        public void onCreate(SQLiteDatabase db) {

            //1.创建数据库的语句
            //构造建表语句
            String creaTTable = "create table user (_id integer PRIMARY KEY AUTOINCREMENT NOT NULL,name varchar,age int)";
            db.execSQL(creaTTable);

            //2.初始化参数 ContentValues
            ContentValues cv = new ContentValues();

            cv.put("name","tom");
            cv.put("age", "20");
            //返回id long型  如果不成功返回-1
            //1-表名
            //2-空列的默认值
            //3-字段和值的key/value集合
            Long l = db.insert("user", null, cv);
            Toast.makeText(Activitydatashujuku.this, "id="+l, Toast.LENGTH_LONG).show();


        }

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

            //执行升级
            //update user set age=10 where _id=?
            //?是一个占位符,然后给占位符赋值

            //初始化数据
            ContentValues cv = new ContentValues();

            cv.put("age", "10");

            //db.update("user",cv,"_id=1",null);
            int rowcount = db.update("user",cv,"_id=? and name=?",new String[]{"1","tom"});

            Log.e("TAG"," rowcount= "+rowcount);
        }
    }

    //创建数据库
    public void chuangjiansjkonclick(View view)
    {
        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",1);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

        sd.close();

    }

    //升级数据库
    public void shengjisjkonclick(View view)
    {
        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",2);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

        sd.close();
    }
    //插入数据
    public void zengjiasjonclick(View view)
    {
        //创建
        DBHelper dh = new DBHelper("test.db",2);
        //连接数据库
        SQLiteDatabase sd = dh.getWritableDatabase();

        ContentValues cv = new ContentValues();
        cv.put("name","再见孙悟空");
        cv.put("age","20");

        Long _id = sd.insert("user", null, cv);

        Log.e("TAG"," _id= "+_id);

        //关闭
        sd.close();


    }

    //查询数据
    public void chaxunsjonclick(View view)
    {
        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",2);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

        //全表查询
        //查询数据库返回 Cursor:游标
        Cursor cursor = sd.query("user", null, null, null, null, null, null);

        //Cursor 一开始会定位在第一条数据的上方
        //移动Cursor到数据的上面,提取数据,然后继续移动

        while(cursor.moveToNext())
        {
            Long _id = cursor.getLong(cursor.getColumnIndex("_id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(2);

            Log.e("TAG"," _id= "+_id + "name= "+name +"age= "+age);
        }
        cursor.close();
        sd.close();
    }
    //修改数据
    public void xiugaisjonclick(View view)
    {
        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",2);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

       /* 不用辅助类连接数据库(了解)
        sd = SQLiteDatabase.openOrCreateDatabase("text.db",null);
        判断是否建表,是否升级了
*/
       ContentValues cv= new ContentValues();

        cv.put("name", "孙悟空");

        int count =  sd.update("user",cv,"_id>=3",null);

        Log.e("TAG", " update count= " + count);

        sd.close();

    }

    //删除数据
    public void shanchusjonclick(View view)
    {

        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",2);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

        int count =  sd.delete("user", "_id=4", null);

        Log.e("TAG", " delete count = " + count);

        //sd.execSQL没有返回值
        sd.execSQL("delete from user where _id = 5");

        sd.close();
    }

    //事务操作
    public void shiwuczonclick(View view)
    {
        //创建  实现工具类
        DBHelper dh = new DBHelper("test.db",2);

        //连接数据库 获取数据库实例
        //getWritableDatabase() 数据写满会报错
        //getReadableDatabase() 数据写满不会报错
        SQLiteDatabase sd = dh.getWritableDatabase();

        try {
            //1.开启事务
            sd.beginTransaction();

            ContentValues cv = new ContentValues();

            cv.put("name", "孙悟饭");

            int count = sd.update("user", cv, "_id=6", null);

            //手动抛出异常
            boolean b = true;
            if (b) {
               // throw new RuntimeException("出现异常信息");
            }

            count += sd.update("user", cv, "_id=7", null);

            Log.e("TAG", " updatecount= " + count);


            //2.设置事务执行成功
            sd.setTransactionSuccessful();
            //提交
        }
        catch (Exception e)
        {
            //回滚
            e.printStackTrace();
            Toast.makeText(Activitydatashujuku.this, "异常信息为"+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        //一定会被执行的代码
        finally {
            //3.结束事务 要确保它一定会执行 finally
            //条件 (1)提交 (2)回滚
            sd.endTransaction();

            sd.close();

        }

    }
}

posted on 2016-04-13 17:01  Chen_s  阅读(391)  评论(0编辑  收藏  举报

导航