第7+8天SQLite数据库操作

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

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();//关闭
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值