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(); } } }