# 1 Android下数据库创建
mysql sqlserver2005 oracle sqlite : 轻量级,内置式
数据库一般用于存储,大量具有结构相同的数据。
创建数据库的流程
:(SqliteOpenHelper:)
1.创建一个帮助类,继承SqliteOpenHelper
public class MyHelper extends SQLiteOpenHelper {)
2.添加一个构造方法,用来指定数据库的名称和版本号
//context: 上下文; name:数据库文件的名称 factory:用于创建cursor对象,默认是null
version:数据库的版本号,从1开始,android4.0版本后只能升不能降
public MyHelper(Context context) {
super(context, "mydb.db", null, 2);
}
3.实现2个方法:
onCreate:数据库第一次创建的时候会调用,特别适合做表结构的初始化
public void onCreate(SQLiteDatabase db) {
//执行sql语句去做表结构的初始化,创建表,需要有一个SqliteDatabase对象
db.execSQL("create table user (_id integer primary key autoincrement,name varchar(20))");
}
onUpgrade:数据库版本发生变化时调用该方法,该方法特别适合做表结构的修改
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//执行sql语句做表结构的修改 数据库版本也需要同时变更 才会起作用
db.execSQL("alter table user add phone varchar(20)");
//System.out.println("旧版本:" + oldVersion + "新版本+" + newVersion);
}
4.创建帮助类对象,并调用getReadableDatabase方法来创建或打开一个数据库。
//1.创建一个数据库帮助类对象
MyHelper mh = new MyHelper(this);
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
SQLiteDatabase rdb = mh.getReadableDatabase();
package com.defineview.bill.mysqlitedemo.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 自定义数据库帮助类
* Created by Bill on 2017/3/13.
*/
public class UserInfoOpenHelper extends SQLiteOpenHelper {
public UserInfoOpenHelper(Context context) {
super(context, "userInfo.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user (_id integer primary key autoincrement ,name varchar(20),phone varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//执行sql语句做表结构的修改 数据库版本也需要同时变更 才会起作用
// db.execSQL("alter table user add phone varchar(20)");
//System.out.println("旧版本:" + oldVersion + "新版本+" + newVersion);
}
}
☆☆getReadableDatabase()和getWritableDatabase()区别:
getWritableDatabase( ):直接以读写的方式打开数据库,如果磁盘空间满了,就直接报错。
getReadableDatabase( ):以读写方式打开数据库,如果磁盘空间满了,再以只读方式打开数据库。
# 2 Android下数据库第一种方式增删改查
特点:通过帮助类得到一个数据库操作对象,执行execSql方法做增删改,执行rawQuery方法做查询,该种方式做增删改没 有返回值不能判断sql语句是否执行成功。 查询灵活可以做多表查询
增删改查的流程:
1.创建一个数据库帮助类对象
mySqliteOpenHelper = new UserInfoOpenHelper(context);
2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
3.执行insert 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
db.execSQL("insert into user (name,phone) values(?,?)", new Object[]{bean.name,bean.phone});
查询方法****:
public void query(){
//创建集合 存放结果集
ArrayList list = new ArrayList();
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
rdb = mh.getReadableDatabase();
//3.执行select 对应的sql语句 的方法 sql:sql语句 selectionArgs:占位符的参数值 返回结果集
Cursor cursor = rdb.rawQuery("select * from user", null);
//4.解析结果集
if(cursor!=null && cursor.getCount()>0){
while(cursor.moveToNext()){//游标是否向下移动
UserBean user = new UserBean();
user.name=cursor.getString(cursor.getColumnIndex("name"));
user.phone=cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name:"+ user.name + "phone:" + user.phone);
list.add(user);
}
//关闭cursor
cursor.close();
}
//5.关闭数据库
rdb.close();
}
4.关闭数据库
db.close();
代码如下;
package com.defineview.bill.mysqlitedemo.utils;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.defineview.bill.mysqlitedemo.model.UserBean;
import java.util.ArrayList;
/**
* Created by Bill on 2017/3/18.
*/
public class UserInfoDbUtils {
private SQLiteDatabase db;
private UserInfoOpenHelper mySqliteOpenHelper;
public UserInfoDbUtils(Context context) {
//1.创建一个数据库帮助类对象
mySqliteOpenHelper = new UserInfoOpenHelper(context);
}
public void add(UserBean bean) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行insert 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
db.execSQL("insert into user (name,phone) values(?,?)", new Object[]{bean.name, bean.phone});
//4.关闭数据库
db.close();
}
public void delete(String name) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行delete 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
db.execSQL("delete from user where name=?;", new Object[]{name});
//4.关闭数据库
db.close();
}
public void update(UserBean bean) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行update 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
db.execSQL("update user set phone=? where name=?;", new Object[]{bean.phone, bean.name});
//4.关闭数据库
db.close();
}
/**
* 查询
*/
public void query() {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
ArrayList list = new ArrayList();
//3.执行select 对应的sql语句 的方法 sql:sql语句 selectionArgs:占位符的参数值
Cursor cursor = db.rawQuery("select * from user", null);
//4.解析结果集
//判断结果集是否有效
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {//游标是否继续向下移动
UserBean bean = new UserBean();
//通过列的索引获取对应的数据
bean.name = cursor.getString(cursor.getColumnIndex("name"));
bean.phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name:" + bean.name + " phone:" + bean.phone);
list.add(bean);
}
//关闭cursor
cursor.close();
}
//5.关闭数据库
db.close();
}
}
# 3 Android下另外一种增删改查方式
特点:通过调用SqliteDatabase对象的insert,update ,delete ,query方法做增删改查,执行结果有了返回值,我们可以根据返回值判断sql是否执行成功。
查询不够灵活,不能做多表查询
增删改查的流程:
1.创建一个数据库帮助类对象
mySqliteOpenHelper = new UserInfoOpenHelper(context);
2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
3.执行db.insert();db.delete();db.update();db.query()
//***创建查询的方法
public void query(){
//创建集合 存放结果集
ArrayList list = new ArrayList();
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
rdb = mh.getReadableDatabase();
//3.//columns:查询的列,如果查询所有传null selection:查询条件 selectionArgs:条件占位符的参数值 groupBy:分组 having:分组条件 orderBy:按什么排序
Cursor cursor = rdb.query("user", new String[]{"name","phone"}, "name=?", new String[]{"zhangsan"}, null, null, "_id desc");
//4.解析结果集
if(cursor!=null && cursor.getCount()>0){
while(cursor.moveToNext()){//游标是否向下移动
UserBean user = new UserBean();
user.name=cursor.getString(cursor.getColumnIndex("name"));
user.phone=cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name:"+ user.name + "phone:" + user.phone);
list.add(user);
}
//关闭cursor
cursor.close();
}
//5.关闭数据库
rdb.close();
}
4.关闭数据库
db.close();
package com.defineview.bill.mysqlitedemo.utils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.defineview.bill.mysqlitedemo.model.UserBean2;
import java.util.ArrayList;
public class UserInfoDbUtils2 {
private SQLiteDatabase db;
private UserInfoOpenHelper2 mySqliteOpenHelper;
public UserInfoDbUtils2(Context context) {
//1.创建一个数据库帮助类对象
mySqliteOpenHelper = new UserInfoOpenHelper2(context);
}
public boolean add(UserBean2 bean) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行insert 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
ContentValues values = new ContentValues();
//key:表中字段的名称
values.put("name", bean.name);
values.put("phone", bean.phone);
//table:表名 nullColumnHack:可以为null values:添加哪些列的数据 return :新添加这一条数据行的id,如果返回-1代表添加失败
long result = db.insert("user2", null, values);//底层是在拼装sql语句
//4.关闭数据库
db.close();
if (result == -1) {
return false;
}
return true;
}
public int delete(String name) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行delete 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
//whereClause:删除条件 whereArgs:条件中占位符的值 返回值:成功删除多少行
int delete = db.delete("user2", "name=?", new String[]{name});
//4.关闭数据库
db.close();
return delete;
}
public int update(UserBean2 bean) {
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行update 对应的sql语句 的方法 sql:sql语句 bindArgs:占位符的参数值
ContentValues values = new ContentValues();
values.put("phone", bean.phone);
//values:更新的列的数据 whereClause:更新条件 whereArgs:条件中占位符的值 返回值:成功修改多少行
int update = db.update("user2", values, "name=?", new String[]{bean.name});
//4.关闭数据库
db.close();
return update;
}
public void query() {
ArrayList list = new ArrayList();
//2.调用帮助类对象的getReadableDatabas方法用来创建数据库
db = mySqliteOpenHelper.getReadableDatabase();
//3.执行select 对应的sql语句 的方法 sql:sql语句 selectionArgs:占位符的参数值
// Cursor cursor = db.rawQuery("select * from user", null);
//columns:查询的列,如果查询所有传null selection:查询条件 selectionArgs:条件占位符的参数值 groupBy:分组 having:分组条件 orderBy:按什么排序
Cursor cursor = db.query("user2", new String[]{"name", "phone"}, "name = ?", new String[]{"王五"}, null, null, "_id desc");
//4.解析结果集
//判断结果集是否有效
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {//游标是否继续向下移动
UserBean2 bean = new UserBean2();
//通过列的索引获取对应的数据
bean.name = cursor.getString(cursor.getColumnIndex("name"));
bean.phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name:" + bean.name + " phone:" + bean.phone);
list.add(bean);
}
//关闭cursor
cursor.close();
}
//5.关闭数据库
db.close();
}
}
# 4 数据库的事务
事务:执行多条sql语句要么同时成功,要么同时失败。事务可以保证你的操作具有原子性,一致性
银行转账:
public void transferAccounts(View v){
//1.创建帮助类对象
BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
//2.调用getReadableDatabase方法
SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
//开启事务
db.beginTransaction();
try {
//3.转账sql
db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
//模拟一个异常标示转账出现故障
int i = 100/0;
db.execSQL("update account set money= money+200 where name=?",new String[]{"张三"});
//标记事务执行成功
db.setTransactionSuccessful();
} finally {
//结束事务,会判断事务是否执行成功,如果所有sql执行成功,提交sql语句更改数据库,如果有一条sql没有执行,回滚之前执行过的sql语句。
db.endTransaction();
}
db.close();
}
cmd命令:
adb shell进入手机linux下,找到数据库文件后可以使用sqlite3指令打开一个数据库,执行sql语句。
例如: adb shell
cd data/data/com.itheima.taransction/databases
ls -l
sqlite3 bank.db
select * from table; 即可参看数据
PS:
cursor:结果集
_id integer (安卓中没有int)
安卓4.0以后数据库版本只能升,不能降
一个数据库,对应一个帮助类文件
类名.this代表此类的一个对象