最近学习安卓遇到了对数据库的操作,用到了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简单实现增删改查的全部内容到此为止。
如果有收获的小伙伴投个币点个赞吧,谢谢~
作者:此成非彼诚