【从零到一】Android数据存储(三) | SQLite数据库

本文详细介绍了SQLite数据库,包括其轻量级、高性能的特点,以及如何通过SQLiteOpenHelper创建和操作数据库。文章还讨论了使用SQL语句和SQLiteDatabase API进行增删改查操作,并提到了可视化工具有助于数据库管理和调试。


1.什么是SQLite数据库?

  • SQLite数据库是一个轻量级的数据库,能够帮助我们存储结构化的数据。

1.1SQLite数据库特点

  1. 小型单文件形式:存储形式就是一个文件,例如:XXXX.db
  2. 性能高:使用B-Tree结构

B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。

  1. 嵌入式:可放在任何只是SQLite数据的平台上使用
  2. 开源跨平台:源码可下载,在Android/IOS上都可以使用
  3. 关系型数据库:可通过多张表的关联关系组织数据,实现数据增删改查
  4. 支持事物操作

1.2实现方式

①创建数据库的方式

  1. context.openOrCreateDatabase(name,mode,cursorFactory) (不推荐)

传入数据库的名字(name),数据库的操作方式(mode),null(cursorFactory)就可以打开数据库(首次调用时创建该数据库)
优点:简单
缺点:不具有扩展性,因此不推荐使用此方法

  1. 继承SQLiteOpenHelper并重写抽象方法 (推荐)

②操作数据库的方式

  1. 执行原生SQL语句
  2. 使用SQLiteDatabase的相关API

db.execSQL(String sql) //执行原生SQL语句
db.insert(String table, String nullColumnHack, ContentValues values) //增
db.delete(String table, String whereClause, String[] whereArgs) //删
db.update(String table, ContentValues values, String whereClause, String[] whereArgs) //改
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) //查


1.3可视化工具

①数据库文件导出工具

  1. adb pull (创建的数据库放在 /data/data/<package_name>/databases/ 目录下)
    在这里插入图片描述
  2. AndroidStudio->View->Tool Windows->Device File Explorer; data/data/<package_name>右键save as到本地
    在这里插入图片描述

②数据库文件查看工具

  1. sqlite3(通过命令行操作,可以提高工作效率) (推荐)
    在这里插入图片描述
  2. 图形化工具,如:Navicat、SQLiteStudio

2.如何创建数据库

2.1SQLiteOpenHelper与SQLiteDatabase的关系

  • 首先我们来了解一下2.1SQLiteOpenHelper和SQLiteDatabase之间的故事。(如下图)
    在这里插入图片描述
  • 透过上图,你可能还不是很清楚我想表达什么,那么上面想表达什么呢??
  1. 我们先自定义一个类(XXHelper)继承SQLiteOpenHelper类
  2. 创建构造函数,复写onCreate()和onUpgrade()这两个方法(同时编写创建数据库的SQL语句)
  3. 再在MainActivity中初始化XXHelper后,通过调用getReadaleDatabase()/getWritableDatabase()方法就成功创建数据库了(得到SQLiteDatabase对象,通过SQLiteDatabase类还可以操作数据库。)

没有实例确实看不太明白,那么一起看下下面这个demo吧:

  1. 先自定义一个类(DatabaseHelper)继承SQLiteOpenHelper类
    在这里插入图片描述
  2. 创建构造函数,复写onCreate()和onUpgrade()这两个方法(同时编写创建数据库的SQL语句)
public class DatabaseHelper extends SQLiteOpenHelper {
    //1.编写创建表的SQL语句
    private static final String CREATE_COURSE = "create table Course (" +
            "id integer primary key autoincrement," +
            "name text," +
            "teacher text," +
            "price real)";

    private Context mContext;

    public DatabaseHelper(Context context, String name,SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //2.执行这条sql语句
        db.execSQL(CREATE_COURSE);
        Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  1. 再在MainActivity中初始化XXHelper后,通过调用getReadaleDatabase()/getWritableDatabase()方法(这里通过一个点击事件完成创建)
public class MainActivity extends AppCompatActivity {
    //3.声明数据库帮助类
    private DatabaseHelper mHelper;
    Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //4.初始化帮助类
                mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,1);
                //5.创建数据库
                mHelper.getWritableDatabase();
            }
        });

    }
}
  1. 没错这样我们就创建了一个数据库 ↓

在这里插入图片描述


是不是感觉差了什么东西,上面复写的onUpgrade()方法都没有用到,那我们接下来讲讲这个方法:

  1. onUpgrade()用于更新数据库,我们只需要把需要的操作放在onUpgrade()方法中 (这里创建了另一张数据库表)
    @Override
    public void onCreate(SQLiteDatabase db) {
        //2.执行这条sql语句
        db.execSQL(CREATE_COURSE);
        db.execSQL(CREATE_STUDENT);
        Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Course");
        db.execSQL("drop table if exists Student");
        onCreate(db);
    }
  1. 在我们初始化自定义帮助类的时候把最后一个参数(version)改为下一个版本号即可,如下:
 //4.初始化帮助类
//                mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,1);
                mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,2);

3.SQLite数据库的增、删、改

①通过SQL语句:

    //SQL语句:增
    private void add() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.execSQL("insert into Student(name,student,age) values(?,?,?)",
                new String[]{"SQLite","macardo","21"});
    }
    //SQL语句:删
    private void delete(){
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.execSQL("delete from Student where student = ?",
                new String[]{"macardo"});
    }
    //SQL语句:改
    private void update() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.execSQL("update Student set student = ? where name = ?",
                new String[]{"macardo2","SQLite"});
    }

在这里插入图片描述


②通过SQLiteDatabase-API:

private void add() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        //通过SQLiteDatabase-API:增
        ContentValues values = new ContentValues();//就是一个存储键值对的集合
        values.put("name","Database");
        values.put("student","macardo1");
        values.put("age","21");
        db.insert("Student",null,values);
    }

    private void delete(){
        SQLiteDatabase db = mHelper.getWritableDatabase();
        //通过SQLiteDatabase-API:删
        db.delete("Student","student = ?",new String[]{"macardo1"});

    }

    private void update() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        //通过SQLiteDatabase-API:改
        ContentValues values = new ContentValues();
        values.put("student","macardo3");
        db.update("Student",values,"name = ?",new String[]{"SQLite"});

    }

4.SQLite数据库的查

Cursor:游标接口,提供遍历查询结构的方法

    private void query() {
        SQLiteDatabase db = mHelper.getWritableDatabase();
        //SQL语句:查
        //Cursor cursor = db.rawQuery("select * from Student", null);
        
        //通过SQLiteDatabase-API:改
        Cursor cursor = db.query("Student",null,null,null,null,null,null);
        
        if (cursor.moveToFirst()){
            do {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String student = cursor.getString(cursor.getColumnIndex("student"));
                Integer age = cursor.getInt(cursor.getColumnIndex("age"));
                Log.d("MainActivity","name = " + name);
                Log.d("MainActivity","student = " + student);
                Log.d("MainActivity","age = " + age);
            }while (cursor.moveToNext());
        }
        cursor.close();
    }

在这里插入图片描述

Github项目地址: Macardo-MySQLite.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值