一、数据存储(数据库以及客户端)

1、SQLite数据库存储

(1)说明

在这里插入图片描述

(2)Sqlite数据库

在这里插入图片描述

(3)Sqlite数据库客户端

在这里插入图片描述

(3)Sqlite数据库命令行

在这里插入图片描述

2、SQLite数据库语句的使用(Sqlite数据库客户端)

(1)Sqlite建表

在这里插入图片描述

1)创建数据库

在这里插入图片描述
在这里插入图片描述

2)创建表SQL
##创建表
create table employee(
       _id integer primary key autoincrement,       
       name varchar,            
       salary double,       
       birthday date
)

在这里插入图片描述

(2)Sqlite的CRUD语句:增删改查语句

在这里插入图片描述

1)插入语句
/*插入*/
insert into employee (name,salary,birthday) values ('Tom',8000,'1988-09-21');

在这里插入图片描述
运行
在这里插入图片描述

2)查询语句
/*查找*/
SELECT * FROM employee where _id = 1;

在这里插入图片描述
运行
在这里插入图片描述
在这里插入图片描述

3)修改更新语句

在这里插入图片描述
运行
在这里插入图片描述
查询
在这里插入图片描述

3)删除语句
/*删除*/
DELETE FROM employee WHERE _id=1;

运行
在这里插入图片描述
查询
在这里插入图片描述
在这里插入图片描述

二、数据存储(在Android当中操作数据):增删改查

1、相关API

(1)SQLiteOpenHelper

在这里插入图片描述

(2)SqliteDatabase

在这里插入图片描述

(3)Cursor

在这里插入图片描述
下面举例
在这里插入图片描述

2、测试用例

在这里插入图片描述

(1)测试Sqlite数据库存储,修改MainActivity当中onClickDB方法

在这里插入图片描述

(2)创建DBActivity

在这里插入图片描述

(3)修改activity_db.xml完善布局

在这里插入图片描述

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:padding="2dp"
    >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testCreateDB"
        android:text="Create DB" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testUpdateDB"
        android:text="Update DB" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testInsert"
        android:text="Insert" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testUpdate"
        android:text="Update" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testDelete"
        android:text="Delete" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testQuery"
        android:text="query" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="testTransaction"
        android:text="Test Transaction" />

</LinearLayout>
(4)完善DBActivity设置回调方法:
package com.itzheng.l04_datastorage;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
/*
 * 测试Sqlite数据库存储
 */
public class DBActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_db);
	}
	/*
	 * 创建库
	 */
	public void testCreateDB(View v) {

	}
	/*
	 * 更新库
	 */
	public void testUpdateDB(View v) {

	}
	/*
	 * 插入
	 */
	public void testInsert(View v) {

	}
	/*
	 * 更新
	 */
	public void testUpdate(View v) {

	}
	/*
	 * 删除
	 */
	public void testDelete(View v) {

	}
	/*
	 * 查询
	 */
	public void testQuery(View v) {

	}
	/*
	 * 测试事务
	 */
	public void testTransaction(View v) {

	}
}

3、完善对应DBActivity当中的回调方法:创建数据库初始化数据

(1)创建DBHelper类并继承SQLiteOpenHelper,完善当前方法

在这里插入图片描述

(2)建表插入一些初始化数据

在这里插入图片描述

/*
 * 数据库操作的帮助类
 */
public class DBHelper extends SQLiteOpenHelper {
	public DBHelper(Context context, int version) {
		super(context, "itzheng.db", null, version);
	}
	/*
	 * 什么时候调用? 当数据库文件创建的时候调用(1次) 在此方法当中做什么? 建表 插入一些初始化数据
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.e("TAG", "DBHelper onCreate");
		//键表
		String sql = "create table person( "
				+ "_id integer primary key autoincrement,"
				+ "name varchar,"
				+ "age int  ) ";
		db.execSQL(sql);
		//插入一些初始化阿虎局
		db.execSQL("insert into person(name,age) values ('Tom1',11) ");
		db.execSQL("insert into person(name,age) values ('Tom2',12) ");
		db.execSQL("insert into person(name,age) values ('Tom3',13) ");
	}
	/*
	 * 当传入的数据库版本号大于数据库的版本号时调用
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.e("TAG", "DBHelper onUpgrade");
	}
}
(3)修改DBActivity当中的testCreateDB方法:实现创建库

完善方法获取连接并创建数据库
在这里插入图片描述

/*
 * 创建库
 */
	public void testCreateDB(View v) {
		//获取要创建的数据库对象
		DBHelper dbHelper = new DBHelper(this, 1);//this当中是content代表当前背景下获取创建数据库对象
		//获取连接
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		
		Toast.makeText(this, "创建数据库", 0).show();
	}

测试
在这里插入图片描述

(4)修改DBActivity当中的testUpdateDB方法:更新库

需要传入更大的版本号
在这里插入图片描述

/*
 * 更新库
*/
	public void testUpdateDB(View v) {
		// 获取要创建的数据库对象
		DBHelper dbHelper = new DBHelper(this, 2);// 传入更大的版本号
		// 获取连接
		SQLiteDatabase database = dbHelper.getReadableDatabase();

		Toast.makeText(this, "更新数据库", 0).show();
	}

在这里插入图片描述

4、完善对应DBActivity当中的回调方法:增,删,改,查,事务

(1)插入数据(添加记录):完善DBActivity当中的testInsert方法

在这里插入图片描述

	/*
	 * 添加记录
	 */
	public void testInsert(View v) {
		//1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		//2、执行insert   insert into person(name,age) values('Tom',12)
		ContentValues values = new ContentValues();
		values.put("name", "Tom");
		values.put("age", 12);
		long id = database.insert("person", null, values);
		//3、关闭
		database.close();
		//4、提示
		Toast.makeText(this, "id="+id, 1).show();
	}

测试:插入数据成功
在这里插入图片描述

(2)更新数据

在这里插入图片描述

	/*
	 * 更新
	 */
	public void testUpdate(View v) {
		// 1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();

		// 2、执行update update person set name = Jack,age=13 where _id = 4
		ContentValues values = new ContentValues();
		values.put("name", "jack");
		values.put("age", 13);
		int updateCount = database.update("person", values, "_id=?", new String[] { "4" });
		// 3、关闭
		database.close();
		// 4、提示
		Toast.makeText(this, "updateCount=" + updateCount, 1).show();
	}

在这里插入图片描述

(3)删除数据

在这里插入图片描述

/*
	 * 删除
	 */
	public void testDelete(View v) {
		// 1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 2、执行delete from person where _id = 2
		int deleteCount = database.delete("person", "_id=2", null);
		// 3、关闭
		database.close();
		// 4、提示
		Toast.makeText(this, "deleteCount=" + deleteCount, 1).show();
	}

测试
在这里插入图片描述

(4)查询数据
1)查询所有

在这里插入图片描述

/*
	 * 查询
	 */
	public void testQuery(View v) {
		// 1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		// 2、执行Query select * from person
		Cursor cursor = database.query("person", null, null, null, null, null, null);
		// 得到匹配的总记录数
		int count = cursor.getCount();
		// 取出cursor当中所有的数据
		while (cursor.moveToNext()) {
			// _id
			int id = cursor.getInt(0);
			// name
			String name = cursor.getString(1);
			// age
			int age = cursor.getInt(cursor.getColumnIndex("age"));
			Log.e("TAG", id + "-" + name + "-" + age);
		}
		// 3、关闭
		cursor.close();
		database.close();
		// 4、提示
		Toast.makeText(this, "count=" + count, 1).show();
	}

在这里插入图片描述

2)查询ID为三的数据

在这里插入图片描述

cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);

在这里插入图片描述

三、事务处理

1、完善DBActivity当中的testTransaction方法

/*
	 * 测试事务 update person set age = 12 where _id = 1; update person set age = 15
	 * where _id = 3
	 */
	public void testTransaction(View v) {
		// 1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();

		// 2、执行update update person set ,age=13 where _id = 4
		ContentValues values = new ContentValues();
		values.put("age", 13);
		int updateCount = database.update("person", values, "_id=?", new String[] { "1" });
		Toast.makeText(this, "updateCount=" + updateCount, 1).show();
		
		
		// 2、执行update update person set age=15 where _id = 3

		values = new ContentValues();
		values.put("age", 15);
		int updateCount2 = database.update("person", values, "_id=?", new String[] { "3" });
		Toast.makeText(this, "updateCount2=" + updateCount2, 1).show();
		// 3、关闭
		database.close();
		// 4、提示
		
	}

在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述

2、以上这样执行不会出现事务的问题,需要将第一个更新功能延迟(抛出异常),修改testTransaction

一个功能中对数据库进行多个操作:要就是都成功要么就是都失败

在这里插入图片描述

	/*
	 * 测试事务 
	 * update person set age = 15 where _id = 1; 
	 * update person set age = 17 where _id = 3
	 * 
	 * 一个功能中对数据库进行多个操作:要就是都成功要就是都失败
	 */
	public void testTransaction(View v) {
		// 1、得到连接对象
		DBHelper dbHelper = new DBHelper(this, 2);
		SQLiteDatabase database = dbHelper.getReadableDatabase();

		// 2、执行update update person set ,age=13 where _id = 4
		ContentValues values = new ContentValues();
		values.put("age", 15);
		int updateCount = database.update("person", values, "_id=?", new String[] { "1" });
		Toast.makeText(this, "updateCount=" + updateCount, 1).show();
		//出了异常
		boolean flag = true;
		if(flag){
			throw new RuntimeException("出异常!!!");
		}
		// 2、执行update update person set age=15 where _id = 3
		values = new ContentValues();
		values.put("age", 17);
		int updateCount2 = database.update("person", values, "_id=?", new String[] { "3" });
		Toast.makeText(this, "updateCount2=" + updateCount2, 1).show();
		// 3、关闭
		database.close();
		// 4、提示
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、处理事务

事务处理三步
1、开启事务:在获取连接后
2、设置事务成功,(在全部正常执行完后)
3、结束事务 (finally中)
在这里插入图片描述

/*
	 * 测试事务 
	 * update person set age = 15 where _id = 1; 
	 * update person set age = 17 where _id = 3
	 * 
	 * 一个功能中对数据库进行多个操作:要就是都成功要就是都失败
	 * 
	 * 事务处理三步
		1、开启事务:在获取连接后
	    2、设置事务成功,(在全部正常执行完后)
	    3、结束事务(finally中)
	 */
	public void testTransaction(View v) {
		SQLiteDatabase database = null;
		try{
			// 1、得到连接对象
			DBHelper dbHelper = new DBHelper(this, 2);
			database = dbHelper.getReadableDatabase();
			//1、开启事务:在获取连接后
			database.beginTransaction();
			//2、设置事务成功,(在全部正常执行完后)
			
			// 2、执行update update person set ,age=13 where _id = 4
			ContentValues values = new ContentValues();
			values.put("age", 15);
			int updateCount = database.update("person", values, "_id=?", new String[] { "1" });
			Toast.makeText(this, "updateCount=" + updateCount, 1).show();
			//出了异常
			boolean flag = true;
			if(flag){
				throw new RuntimeException("出异常!!!");
			}
			// 2、执行update update person set age=15 where _id = 3
			values = new ContentValues();
			values.put("age", 17);
			int updateCount2 = database.update("person", values, "_id=?", new String[] { "3" });
			Toast.makeText(this, "updateCount2=" + updateCount2, 1).show();
			// 3、关闭
			//2、设置事务成功(在全部执行之后)
			database.setTransactionSuccessful();
		}catch(Exception e){
			e.printStackTrace();
			Toast.makeText(this, "出异常啦!!!", 1).show();
		} finally{
			//3、结束事务(finally中)
			if(database != null){
				database.endTransaction();
				// 4、提示
				database.close();
			}
		}

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐