一、数据库的创建
1.定义一个类继承SQLiteOpenHelper
2.父类中没有无参的构造方法,要写构造方法
public MyOpenHelper(Context context) {
/*
context:上下文
name:数据库的名字
factory:目的创建cursor对象
version:数据库的版本,从1开始
*/
super(context, name, factory, version);
}
3.MainActivity中调用MyOpenHelper()方法创建数据库
MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());
// (1)创建或打开一个数据库,第一次调用为创建
SQLiteDatabase writableDatabase = myOpenHelper.getWritableDatabase();
// (2)创建或打开一个数据库,第一次调用为创建,区别:如果磁盘满了,返回只读的
SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
4.onCreate方法
1)数据库第一次被创建的时候调用,所以此方法适合做表结构的初始化
2).execSQL();内写SQL语句
public void onCreate(SQLiteDatabase db) {
//创建一个表,有id,name两个列
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20))");
}
3)生成的数据库文件可用SQLiteExpert工具打开
5.onUpgrade方法
1)当数据库版本升级的时候调用,此方法适合做表结构的更新
public MyOpenHelper(Context context) {
super(context, "pqx.db", null, 2); //版本改为2
}
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL("alter table info add phone varchar(20)"); //添加一列phone
}
2)版本只能升不能降
6.增删查改SQL语句的编写
1)在SQLiteExpert中
insert into info (name,phone) values('李四','13280025834');
insert into info (name,phone) values('谭立波','17616138165');
update info set name='潘擎轩' where _id=1;
delete from info where name='谭立波';
delete from info;
select name,phone from info;
2)在Android Studio中
//(1)定义4个按钮,分别是增、删、查、改 ----以增为例----
public void cilck(View v){
//(2)再点击事件中,首先获取数据库对象
SQLiteDatabase writableDatabase = myOpenHelper.getWritableDatabase();
//(3)执行增加一条的SQL语句
db.execSQL("insert into info (name,phone) values(?,?)",new Object[]{"张三","13888888"});
//(4)数据库用完需要关闭
db.close();
}
public void click(View v){ //查询按钮的点击事件
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * where info", null); //通过查询返回一个Cursor集
if (cursor!=null && cursor.getCount()>0){ //如果查询返回的不为空,并且存在1行以上数据
while (cursor.moveToNext()){ //cursor一直往下移
String name = cursor.getString(1); //参数为列的索引
String phone = cursor.getString(2);
System.out.println("name:"+name+"-----phone:"+phone);
}
}
}
3)使用SQL方式缺点:
1.SQL语句容易写错
2.执行SQL语句没有返回值,不容易进行判断
4)使用SQL方式优点:
1.容易进行多表查询
5)使用命令行工具 sqlite3可以打开数据库
1.打开 cmd 后输入 adb shell ,然后进入/data/data/包/databases下
2.输入:sqlite3 数据库名。然后输入sql语句即可
3.改变dos命令行的编码方式:chcp 936是改变为默认的GBK编码方式,chcp 65001是改变为utf-8编码方式
7.使用谷歌封装好的api进行增删查改
1)增
public void click(View v){
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
ContentValues values =new ContentValues(); //ContentValues存储数据的集合,只能存基本数据类型
values.put("name","王五");
values.put("phone","110");
//插入
long yon = db.insert("info", null, values); //返回新插入行的id
db.close();
if(yon>0){
Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(MainActivity.this,"添加失败",Toast.LENGTH_LONG).show();
}
}
2)删
//info为表名,name为条件(键/列标题),new String[]{}内写要删除的条件的值
int delete = db.delete("info", "name=?", new String[]{"王五"}); //返回的为受影响的行数
Toast.makeText(MainActivity.this,"删除了"+delete+"行",Toast.LENGTH_LONG).show();
3) 更新(改)
ContentValues values =new ContentValues();
values.put("phone","114");
int update = db.update("info", values, "name=?", new String[]{"王五"});
Toast.makeText(MainActivity.this,"更新了"+update+"行",Toast.LENGTH_LONG).show();
4)查
/*
table:表名
columns:想要查询哪一列,若查询所有输入null即可
selection:根据什么查询,值用?占位
selectionArgs:上一个参数的值
groupBy:是否分组,不用的话null即可
having:过滤条件
orderBy:排序
*/
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
//例
Cursor cursor = db.query("info",new String[]{"phone"},"name=?",new String[]{"王五"},null,null,null);
if (cursor!=null && cursor.getCount()>0){
while (cursor.moveToNext()){
String phone = cursor.getString(0);
System.out.println("phone:"+phone);
}
}
5)优点:
1.写法简单,不需要复杂的sql语句,不容易写错
2.有返回值,方便开发者进行开发
6)缺点
如果有多张表,不容易进行查询
二、数据库中的事物
public void click(View v){
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//使用事物进行转账
db.beginTransaction();//开启事物
try{
db.execSQL("update info set money = money-100 where name=?",new Object[]{"王五"});//更新数据money-100
db.execSQL("update info set money = money+100 where name=?",new Object[]{"李四"});//更新数据money+100
db.setTransactionSuccessful(); //给当前事物设置一个成功的标记,如果没有执行到,回滚
}catch (Exception e){
Toast.makeText(MainActivity.this,"服务器繁忙,请稍后再试",Toast.LENGTH_LONG).show();
} finally {
db.endTransaction();//关闭事物
}
}