【android】SQLiteOpenHelper实现数据库的增删改查(封装的思想,一个小框架)

最近学习安卓遇到了对数据库的操作,用到了SQLiteOpenHelper这个类来连接或者创建数据库,通过getWritableDatabase()或者getReadableDatabase(),来对表进行写入或读取操作。

1. 为什么需要SQLiteOpenHelper?

SQLiteOpenHelper重点在于helper,他是SQLiteDatabase的一个帮助类,便于开发者实现对SQLite的数据进行写入(增删改)和读取(查询)。

2. SQLiteOpenHelper具体有什么方法?

使用SQLiteOpenHelper,便是构建一个类将其继承,有三个方法必须实现:

2.1 构造方法

SQLiteOpenHelper有许多构造方法,最常用的是这种:

public SQLiteOpenHelper(@Nullable Context context, 
                        @Nullable String name,
                        @Nullable CursorFactory factory, 
                        int version) 
    {
        this(context, name, factory, version, null);
    }

可以看见有四个参数,分别是:

  • 上下文
  • 数据库名称
  • 游标工厂
  • 版本号

而其代码块部分调的是另一个构造函数,最后一个参数为null,不需考虑。

2.2 oncreate()方法

由于是抽象方法,所以子类一定要实现;

它的作用是数据库第一次创建时,进入执行;一般将创建表的sql语句写进其中。

一个参数:当前连接或者创建的SQLiteDatabase对象

//数据库第一次创建时调用的函数
public abstract void onCreate(SQLiteDatabase db);

2.3 onUpgrade()方法

它的作用是数据库的版本号更新(增加时),进入执行;一般将修改表整体结构的sql语句写入其中。

三个参数:当前连接或者创建的SQLiteDatabase对象、旧版本号、新版本号

扫描二维码关注公众号,回复: 10365490 查看本文章
//数据库版本版本号增加时调用的函数
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

3. 如何使用SQLiteOpenHelper(具体实例)?

3.1 数据连接层 MySQLiteHelper(名字自拟)

定义一个类继承SQLiteOpenHelper

我这里类名叫MySQLiteHelper,属性:数据库名demo、表名user、版本1。

注意:子类的构造函数可以只传一个上下文,其余直接赋属性值,因为基本不会变化(特殊情况除外)

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class MySQLiteHelper extends SQLiteOpenHelper {
    private final static String DATABASE_NAME= "demo";//数据库名称
    private final static String TABLE_NAME= "user";//表名
    private final static int VERSION= 1;//当前版本

    //参数分别是:上下文,数据库名,游标工厂,数据库版本
    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }
    //数据库第一次创建时调用的函数
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="Create table "+
                TABLE_NAME+
                "(" +
                "id integer primary key autoincrement," +
                "username varchar(20)," +
                "password varchar(20)" +
                ")";
        db.execSQL(sql);
    }
    //数据库版本版本号增加时调用的函数
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d("hc", "onUpgrade: 版本更新了!");
    }
}

3.2 数据访问层 MySQLiteDao(名字自拟)

这个类就把所有对数据表的操作封装,每一个操作写一个方法:增、删、改、查、清空

将这个类的构造函数作为MySQLiteHelper连接类的实现方法

通过logcat的hc标签来查看结果

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MySQLiteDao {
    private MySQLiteHelper mySQLiteHelper;

    //构造函数,实例化MySQLiteHelper
    public MySQLiteDao(Context context){
        this.mySQLiteHelper=new MySQLiteHelper(context);
        Log.d("hc", "MySQLiteDao: 创建或连接");
    }
    //简单的固定增加
    public void add(){
        SQLiteDatabase db = mySQLiteHelper.getWritableDatabase();
        String sql="insert into user values(null,?,?)";
        db.execSQL(sql,new String[]{"小明","123"});
        db.close();
        Log.d("hc", "add: 新增");
    }
    //简单的全查
    public List<User> queryAll(){
        SQLiteDatabase db = mySQLiteHelper.getReadableDatabase();
        List<User> users= new ArrayList<>();//user集合
        User user=null;//单个user
        String sql="select * from user";
        Cursor cursor=db.rawQuery(sql,null);
        while (cursor.moveToNext()){
            //单个user赋值
            user=new User(
              cursor.getInt(0),
              cursor.getString(1),
              cursor.getString(2)
            );
            //放到集合中
            users.add(user);
        }
        db.close();
        Log.d("hc", "queryAll: 全查");
        return users;
    }
    //简单的通过id来修改,值已写死
    public void update(int id){
        SQLiteDatabase db = mySQLiteHelper.getWritableDatabase();
        String sql="update user set username=?,password=? where id=?";
        db.execSQL(sql,new String[]{"小红","10086",String.valueOf(id)});
        //关闭db通道
        db.close();
        Log.d("hc", "update: 修改");
    }
    //简单的通过id来删除
    public void delete(int id){
        SQLiteDatabase db = mySQLiteHelper.getWritableDatabase();
        String sql="delete from user where id= ?";
        db.execSQL(sql,new String[]{String.valueOf(id)});
        Log.d("hc", "delete: 删除");
    }
    //简单的删除,清空数据库数据
    public void deleteAll(){
        SQLiteDatabase db = mySQLiteHelper.getWritableDatabase();
        String sql="delete from user";
        db.execSQL(sql);
        Log.d("hc", "deleteAll: 清空");
    }
}

3.3 数据控制层 MainActivity(自拟,不过这个是原生的)

作为实现与手机交互的activity,它需要对事件进行处理,我这里只有点击事件,实现自身类监听点击事件,根据id值判断点击的哪个按钮,删除和修改根据输入框的id数值来执行具体操作。

注意:如果android studio版本过低,继承的AppCompatActivity无法找到,请继承Activity

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btnCreate;
    private Button btnInsert;
    private Button btnQuery;
    private Button btnUpdate;
    private Button btnDelete;
    private Button btnDeleteAll;
    private EditText et;
    private MySQLiteDao mySQLiteDao;//数据访问层,包含数据库的启动

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    //初始化
    private void init(){
        btnCreate=findViewById(R.id.create);
        btnInsert=findViewById(R.id.insert);
        btnQuery=findViewById(R.id.query);
        btnUpdate=findViewById(R.id.update);
        btnDelete=findViewById(R.id.delete);
        btnDeleteAll=findViewById(R.id.deleteAll);
        et=findViewById(R.id.et);

        btnCreate.setOnClickListener(this);
        btnInsert.setOnClickListener(this);
        btnQuery.setOnClickListener(this);
        btnUpdate.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
        btnDeleteAll.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.create:
                mySQLiteDao=new MySQLiteDao(this);
                break;
            case R.id.insert:
                mySQLiteDao.add();
                break;
            case R.id.query://全查后从logcat输出
                List<User> users=mySQLiteDao.queryAll();
                if (users.isEmpty()){
                    Log.d("hc", "没有数据哦!");
                }
                for (User user:users){
                    Log.d("hc",
                            "id: "+user.getId()+
                            "\tusername: "+user.getUsername()+
                            "\tpassword: "+user.getPassword());
                }
                break;
            case R.id.update:
                //拿到需要需改的id
                if (et.length()==0){//没有就弹出提示
                    Toast.makeText(this,"id值没填",Toast.LENGTH_SHORT).show();
                    Log.d("hc", "请输入需要修改的id");
                }else {//有就去修改
                    mySQLiteDao.update(Integer.valueOf(et.getText().toString()));
                }
                break;
            case R.id.delete:
                //拿到需要删除的id
                if (et.length()==0){//没有就弹出提示
                    Toast.makeText(this,"id值没填",Toast.LENGTH_SHORT).show();
                    Log.d("hc", "请输入需要删除的id");
                }else {//有就去删除
                    mySQLiteDao.delete(Integer.valueOf(et.getText().toString()));
                }
                break;
            case R.id.deleteAll:
                mySQLiteDao.deleteAll();
                break;
        }
    }
}

3.4 activity的布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:text="数据库简单小框架"
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:gravity="center"
        android:layout_marginTop="10dp"/>
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入修改和删除的id值"
        android:layout_marginTop="20dp"/>
    <Button
        android:text="创建或连接数据库"
        android:id="@+id/create"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"/>
    <Button
        android:text="插入数据"
        android:id="@+id/insert"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:text="查询数据"
        android:id="@+id/query"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:text=" 修改指定数据"
        android:id="@+id/update"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:text=" 删除指定数据"
        android:id="@+id/delete"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:text="清空数据"
        android:id="@+id/deleteAll"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

3.5 实现结果(注意,一定要先点连接数据库才可以进行其他操作)

手机

logcat查看hc

好,SQLiteOpenHelper简单实现增删改查的全部内容到此为止。

如果有收获的小伙伴投个币点个赞吧,谢谢~

发布了13 篇原创文章 · 获赞 14 · 访问量 970

猜你喜欢

转载自blog.csdn.net/qq_42495847/article/details/105225617