目录
1. SQLite数据库介绍
SQLite是Android内置的一个小型、关系型、属于文本型的数据库,通常只需要几百K的内存就足够了。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务。
2. 数据库的增删查改
2.1创建数据库以及更新数据库
创建一个类继承 SQLiteOpenHelper 需要重写 以下两个方法
onCreate 创建数据库
onUpgrade 更新数据库
划重点:onCreat方法是在调用getWritableDatabase()或者getReadableDatabase()才会回调该方法
/**
* onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
* <p>
* 1.当数据库第一次被创建的时候调用的方法,适合在这个方法里面把数据库的表结构定义出来.
* 所以只有程序第一次运行的时候才会执行
* 如果想再看到这个函数执行,必须写在程序然后重新安装这个app
* 2.数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
* 所以是调用以上方法的时候才会回调该方法
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table IF NOT EXISTS STUDENT(id integer primary key autoincrement, name varchar(20)," +
"age int,sex varchat(10))");
}
/**
*
* @param db 数据库
* @param oldVersion 老版本
* @param newVersion 新版本
* 这里的删除等操作必须要保证新的版本必须要比旧版本的版本号要大才行。[即 Version 2.0 > Version 1.0 ] 所以这边我们不需要对其进行操作
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (version > 1) {
db.execSQL("alter table STUDENT add address varchar(60)");
}
}
2.2 插入数据
划重点
- insert()也可以使用excelSQL()代替
- 操作完一定要关闭数据库
public long addData(StudentInfoBean studentInfoBean) {
// 增删改查每一个方法都要得到数据库,然后操作完成后一定要关闭
// getWritableDatabase(); 执行后数据库文件才会生成
// 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
SQLiteDatabase sqLiteDatabase = mSQLiteHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", studentInfoBean.getName());
contentValues.put("age", studentInfoBean.getAge());
contentValues.put("sex", studentInfoBean.getSex());
// 返回,显示数据添加在第几行
// 加了现在连续添加了3行数据,突然删掉第三行,然后再添加一条数据返回的是4不是3
// 因为自增长
long rowid = sqLiteDatabase.insert(tableName, null, contentValues);
//也可以如下
//sqLiteDatabase.execSQL("insert into STUDENT(name,age,sex) values('111',1,'男')");
sqLiteDatabase.close();
return rowid;
}
2.3 修改数据库
划重点:还是不要忘记关闭数据库
/**
* 第一个参数是表名,书写上你要更新的表名
* 第二个参数是ContentValues对象,要把更新数据在这里组装进去。
* 第三个参数String:WHERE表达式,where选择语句, 选择那些行进行数据的更新, 如果该参数为 null, 就会修改所有行;?号是占位符
* 第四个参数String[]:where选择语句的参数, 逐个替换 whereClause 中的占位符;
**/
public int updateData(StudentInfoBean studentInfoBean) {
SQLiteDatabase sqLiteDatabase = mSQLiteHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("age", studentInfoBean.getAge());
contentValues.put("sex", studentInfoBean.getSex());
int rowcount = sqLiteDatabase.update(tableName, contentValues, "name=?", new String[]{studentInfoBean.getName()});
sqLiteDatabase.close();
return rowcount;
}
2.4 删除数据
2.4.1 删除一条数据
/**
*
* 第一个参数String:需要操作的表名
* 第二个参数String:where选择语句, 选择哪些行要被删除, 如果为null, 就删除所有行;
* 第三个参数String[]: where语句的参数, 逐个替换where语句中的 "?" 占位符;
* @return 返回
*/
public int deleteData(String name) {
SQLiteDatabase sqLiteDatabase = mSQLiteHelper.getWritableDatabase();
int deleteResult = sqLiteDatabase.delete(tableName, "name=?", new String[]{name});
sqLiteDatabase.close();
return deleteResult;
}
2.4.2 清空一张表
//清空某一个表
public void deleteTable(SQLiteDatabase db){
db.execSQL("delete from tab_name");
}
2.4.3 删除一张表
//删除某一个表
public void dropTable(SQLiteDatabase db){
db.execSQL("drop table tab_name");
}
2.4.4 删除数据库
/**
* 删除数据库
* deleteDatabase是Context的方法
*/
public void deleteDatabase(){
SQLiteDatabase sqLiteDatabase = mSQLiteHelper.getWritableDatabase();
mContext.deleteDatabase("sql.db");
}
2.5 查询数据
查询时最复杂的,我去大神那边给你们找来了些资料
大神的地址是 https://blog.csdn.net/carson_ho
//第一种最为简单
//将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数(selectionArgs)
db.rawQuery(String sql, String[] selectionArgs);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
//参数说明
//table:要操作的表明
//columns:查询的列所有名称集
//selection:WHERE之后的条件语句,可以使用占位符
//groupBy:指定分组的列名
//having指定分组条件,配合groupBy使用
//orderBy指定排序的列名
//limit指定分页参数
//distinct可以指定“true”或“false”表示要不要过滤重复值
//所有方法将返回一个Cursor对象,代表数据集的游标
//Cursor对象常用方法如下:
c.move(int offset); //以当前位置为参考,移动到指定行
c.moveToFirst(); //移动到第一行
c.moveToLast(); //移动到最后一行
c.moveToPosition(int position); //移动到指定行
c.moveToPrevious(); //移动到前一行
c.moveToNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //总数据项数
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值
划重点:仔细看下面的注释就都懂了,不懂的话。。。那就找我讨论吧
/**
* 1.rawQuery与query的区别:rawQuery是直接使用SQL语句进行查询
* query是通过Android自己封装的API
* 2.rawQuery的第二个参数是替换占位符,如select name from user where id=?”, new String[]{“1”}
* 将?替换成1
*
* @return
*/
public List<StudentInfoBean> queryData() {
SQLiteDatabase sqLiteDatabase = mSQLiteHelper.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("Select * From STUDENT", null);
//cursor.getColumnIndex("name") 返回name对应的索引值
//cursor.getString() 返回该索引指定的值
List<StudentInfoBean> studentInfoBeans = new ArrayList<>();
while (cursor.moveToNext()) {
StudentInfoBean studentInfoBean = new StudentInfoBean();
studentInfoBean.setName(cursor.getString(cursor.getColumnIndex("name")));
studentInfoBean.setAge(cursor.getInt(cursor.getColumnIndex("age")));
studentInfoBean.setSex(cursor.getString(cursor.getColumnIndex("sex")));
studentInfoBeans.add(studentInfoBean);
}
sqLiteDatabase.close();
return studentInfoBeans;
}
3.数据库的事务
作用:保证某些操作要么全部成功,要么全部不成功
例子:比如A转账给B一笔钱,A的钱转出去了,而B没收到钱,这个时候就需要用到事务了。
/**
* beginTransaction() :开启一个事务,在捕获异常的代码块中去执行具体的数据库操作
* setTransactionSuccessful(): 表示事务以及执行成功
* 最后在finally代码块中调用 endTransaction()来结束事务
*/
tv_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction(); // 开启事务
try {
// 执行删除操作 db.delete(..........)
if (true) {
// 在这里手动抛出一个异常,让事务失败
throw new NullPointerException();
}
// 执行添加操作
db.setTransactionSuccessful(); // 事务已经执行成功
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction(); // 结束事务
}
}
});
4.Demo地址
描述:对学生表的增删查改
地址:Demo地址
动态图:
恳求各位大佬点个赞咯