Android快速入门-----数据存储(二)SQLite数据库存储(增删改查)事务处理
一、数据存储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,
·
一、数据存储(数据库以及客户端)
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();
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献17条内容
所有评论(0)