文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 13:45

关注

最近学习安卓遇到了对数据库的操作,用到了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对象、旧版本号、新版本号


//数据库版本版本号增加时调用的函数
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 queryAll(){
        SQLiteDatabase db = mySQLiteHelper.getReadableDatabase();
        List 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 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)


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

手机

logcat查看hc

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

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


作者:此成非彼诚


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯