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) {
}

}

五.代码:

举例:创建一张表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) {
}

}

2.根据表名定义实体类:Student.java

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<Student> queryAll(){
    //获得数据库对象,可读可写
    SQLiteDatabase db=myHelper.getWritableDatabase();
    //创建集合
    ArrayList<Student> 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<Student> 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();//关闭
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章