SQLite数据库操作
SQLite数据库
一.SQLite数据库介绍
二.数据库核心类
三.SQL语句复习:
四.数据库简单代码:
五.代码:
六,使用事务批量处理数据
1.什么是事务?
2…事务的好处?
3.代码:
SQLite数据库
一.SQLite数据库介绍
1.Android 系统中集成的轻量级的数据库
2.特点:
轻量级 只用一个动态的库, 是以单个文件的形式进行存取
跨平台 支持多个操作系统
零配置 无需安装, 直接使用
嵌入式 内嵌到手机中
3.在程序的内部可以通过数据库的名称访问, 其他应用不能访问
4.路径: data/data/应用程序包名/database/ ****.db
5.存放的类型:
NULL 空值
INTEGER 整型(不用int)
VARCHAR 可变长度的字符数据
TEXT 文本字符串
BOOLEAN 布尔
DATE
TIME
二.数据库核心类
1.SQLiteOpenHelper 数据库的帮助类, “用于数据库的创建和版本更新”
(1)定义一个类, 继承SQLiteOpenHelper
(2)重写构造方法 :提供数据库的基本信息 : 上下文对象,数据库名称,Null,数据库的版本号
(3)重写父类的方法:
onCreate():第一次创建数据库时调用, 只会执行一次 – “初始化表,初始化数据”
onUpgrade()
2.SQLiteDatabase 数据库的操作类, “操作数据库: 执行sql语句/增/删/改/查”
(0)获取SQLiteDatabase对象
(1)执行sql 语句
void execSQL(String sql,String[] bindArgs); 执行增删改
Cusor rawQuery(String sql,String[] selectionArgs); 执行查询
(2)执行方法 – 封装好的方法 (适用于菜鸟级别的程序员)
insert() 插入数据
update() 修改数据
delete() 删除数据
query() 查询数据
三.SQL语句复习:
1.创建表:
create table student(_id integer primary key autoincrement,name varchar(30),age integer,address varchar(30));
2.添加数据:insert into student values(null,‘要甜雪’,18,‘北京市海淀区’);
3.修改数据:update student set age=13,address=‘河北省沧州市’ where name=‘要甜雪’;
4. 查询数据:
select * from student where 字段 = ‘值’
模糊查询: select * from 表名 where name like ‘%小%’
select * from student order by age desc 降序查询
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 求平均值
count(列名) 统计记录数
5.删除数据:delete from student where id=12;
四.数据库简单代码:
举例:创建一张表student(id name age address)
1.自定义类继承SQLiteOpenHelper
注意:onCreate方法只会执行一次,如果想要修改表的字段,修改oncreate方法的话是不行的,需要删除之前生成的数据库
//TODO 1:定义类继承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
//TODO 2: 构造
public MyHelper(Context context) {
super(context, “student.db”, null, 1);
}
//TODO 3:重写父类的方法
/**
* 创建数据库时调用, 只执行一次 – 初始化表, 初始化数据
* @param db 数据库的操作类
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table User(_id integer primary key autoincrement,Name varchar(20),Sex varchar(20),Age integer)”);
}
/**
* 更新数据 --- 如果数据库的 版本号发生变化, 执行该方法 --- 执行多次
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.执行增删改查方法:
public void insert(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
db.execSQL("insert into User(Name,Sex,Age) values('尹志强','男',18)");
//方式二:
//参数一表名 参数二:默认值 参数三:要插入的值
ContentValues values = new ContentValues();
values.put("Name","殷志强");
values.put("Sex","男");
values.put("Age","18");
db.insert("User",null,values);
}
//TODO:修改数据
public void updateData(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
db.execSQL("update User set Age = 3 where name=?",new String[]{"尹志强"});
//方式二:参数一:表名 参数二:要修改的值 参数三:条件 参数四:为条件中的?赋值
ContentValues values = new ContentValues();
values.put("Age","3");
int num=db.update("User",values,"name=?",new String[]{"尹志强"});
}
//TODO:删除数据
public void deleteData(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
String sql="delete from User where name = ? ";
db.execSQL(sql,new String[]{"张磊"});
//方式二:参数一:表名 参数二:要修改的值 参数三:条件 参数四:为条件中的?赋值
ContentValues values = new ContentValues();
values.put("Age","3");
int num=db.update("User",values,"name=?",new String[]{"尹志强"});
}
//TODO:查询数据
public void query1(View view) {
//创建一个数据库
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一
//Cursor cursor = db.rawQuery("select * from User",null);
//方式二
Cursor cursor=db.query("User",null,null,null,null,null,null);
//循环输出
while (cursor.moveToNext())
{
//cursor.getColumnIndex("Name") 通过列名 获取所在列的编号
//cursor.getString(列的编号); 通过列的编号, 得到该列的数据
String Name = cursor.getString(cursor.getColumnIndex("Name"));
String Sex = cursor.getString(cursor.getColumnIndex("Sex"));
int Age = cursor.getInt(cursor.getColumnIndex("Age"));
Log.i("yaotianxue","姓名: " + Name +", 性别: "+ Sex + ", 年龄 : "+ Age);
}
}
五.代码:
举例:创建一张表student(id name age address)
1.自定义类继承SQLiteOpenHelper
注意:onCreate方法只会执行一次,如果想要修改表的字段,修改oncreate方法的话是不行的,需要删除之前生成的数据库
//TODO 1:定义类继承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
//TODO 2: 构造
public MyHelper(Context context) {
super(context, "student.db", null, 1);
}
//TODO 3:重写父类的方法
/**
* 创建数据库时调用, 只执行一次 -- 初始化表, 初始化数据
* @param db 数据库的操作类
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table student(_id integer primary key autoincrement,name varchar(20),age integer)");
}
/**
* 更新数据 --- 如果数据库的 版本号发生变化, 执行该方法 --- 执行多次
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class Student {
private int _id;
private String name;
private int age;
public Student(int _id, String name, int age) {
this._id = _id;
this.name = name;
this.age = age;
}
public int get_id() {
return _id;
}
public void set_id(int _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.数据库工具类,提供增删改查方法,不要在Activity中执行SQL语句,做到MVC模式:
public class StudentDao {
MyHelper myHelper;
//提供构造方法:将数据库创建出来
public StudentDao(Context context) {//传递上下文对象
myHelper=new MyHelper(context);
}
/***
* @param student 传递你要插入的对象
* @return 插入是否成功
*/
public boolean add(Student student){
//获得数据库对象,可读可写
SQLiteDatabase db=myHelper.getWritableDatabase();
//创建ContentValues对象,封装你要插入的数据
ContentValues values = new ContentValues();
values.put("name",student.getName());
values.put("age",student.getAge());
long num=db.insert("student",null,values);
//判断是否插入成功
if(num>0){
return true;
}else{
return false;
}
}
/***
* 根据id删除数据
* @param id
* @return 代表删除的个数
*/
public int deleteById(int id){
//获得数据库对象,可读可写
SQLiteDatabase db=myHelper.getWritableDatabase();
return db.delete("student","id=?",new String[]{id+""});
}
/***
* 根据name删除数据
* @param name
* @return 代表删除的个数
*/
public int deleteByName(String name){
//获得数据库对象,可读可写
SQLiteDatabase db=myHelper.getWritableDatabase();
return db.delete("student","name=?",new String[]{name+""});
}
/***
* 根据id修改数据
* @param student 传递你要修改成的对象
* @return
*/
public int update(Student student,int id){
//获得数据库对象,可读可写
SQLiteDatabase db=myHelper.getWritableDatabase();
//创建ContentValues对象,封装你要插入的数据
ContentValues values = new ContentValues();
values.put("name",student.getName());
values.put("age",student.getAge());
return db.update("student",values,"id=?",new String[]{id+""});
}
/***
*
* @return 查询所有的数据
*/
public ArrayList queryAll(){
//获得数据库对象,可读可写
SQLiteDatabase db=myHelper.getWritableDatabase();
//创建集合
ArrayList list = new ArrayList<>();
//执行查询语句
Cursor cursor = db.query("student", null, null, null, null, null, null);
//遍历游标
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
//创建对象存入集合中
Student student = new Student(id, name, age);
list.add(student);
}
return list;
}
}
4.执行增删改查操作,将查询到的数据展现在ListView中
public class Main2Activity extends AppCompatActivity {
private StudentDao dao;
private ListView listView;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.lv);
dao=new StudentDao(Main2Activity.this);
}
//TODO:插入数据
public void insert(View view) {
Student student = new Student("姚甜雪", 34);
dao.insert(student);
}
//TODO:删除数据
public void delete(View view) {
dao.deleteById(1);
}
//TODO:修改数据
public void update(View view) {
Student student = new Student("姚甜雪1号", 78);
dao.update(student,1);//将id为1的student修改成
}
//TODO:查询数据
public void query(View view) {
//查询数据
ArrayList list = dao.queryAll();
//创建适配器
myAdapter=new MyAdapter(Main2Activity.this,list);
listView.setAdapter(myAdapter);
}
}
六,使用事务批量处理数据
1.什么是事务?
就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !
在Android应用程序开发中,经常会遇到需要进行数据库操作的时候,有关数据库事务处理对Android应用程序的稳定性和效率提升非常重要。
2…事务的好处?
1.首先Android数据库操作,特别是进行写操作的时候非常慢,将所有操作打包成一个事务能大大提高处理速度。
2.保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚。
例如:应用程序初始化时需要批量插入大量数据,单独的使用for循环方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败,后续还得删除。太麻烦)
3.代码:
SQLiteDatabase db = myHepler.getWritableDatabase();
db.beginTransaction();//开启事务
try {
for (int i=0;i<1000;i++) {
db.execSQL(“insert into 表名 (字段名) values(值)”);
}
db.setTransactionSuccessful();//成功
}catch (Exception e){
e.printStackTrace();
}finally {
db.endTransaction();//结束事务
db.close();//关闭
}