Android SQLite使用详解

数据库SQLite

数据库管理器 (SQLiteDatabase)

SQLiteDatabase是SQLite的数据库管理类,它提供若干操作数据表的API,常用的方法有3类:

1.管理类,用于数据库层面的操作
方法说明
openDatabase打开指定路径的数据库
isOpen判断数据库是否已打开
close关闭数据库
getVersion获取数据库的版本号
setVersion设置数据库的版本号
public void onClick(View view) {
        //getFilesDir() = /data/data/包名/files
        String db = getFilesDir() + "/test.db";
        //创建或打开数据库,如果存在就打开,如果不存在就创建
        //第三个参数是游标工厂,主要用于查询,暂时先设为Null
        SQLiteDatabase sqLiteDatabase = openOrCreateDatabase(db, Context.MODE_PRIVATE, null);
        if (sqLiteDatabase != null) {
            Log.d("message", "创建成功");
        }
        //删除数据库
        boolean result = deleteDatabase(db);
        if (result) {
            Log.d("message", "删除成功");
        }
        else{
            Log.d("message", "删除失败");
        }
}
2.事务类,用于事务层面的操作
方法说明
beginTransaction开始事务
setTransactionSuccessful设置事务的成功标志
endTransaction结束事务
public long update(User user){
   ContentValues values = new ContentValues();
   values.put("name", user.getName());
   values.put("age", user.getAge());

   try {
       //开启事务
       writeDB.beginTransaction();
       //对DB做操作
       writeDB.update("User",values, "name=?", new String[]{user.getName()});
       //操作成功
       writeDB.setTransactionSuccessful();
   }catch (Exception e){
       e.printStackTrace();
   }
   finally {
       //结束事务
       writeDB.endTransaction();
   }
   return 1;
}
3.数据处理类,用于数据表层面的操作
方法说明
execSQL执行拼接好的SQL控制语句
insert插入记录
delete删除符合条件的记录
update更新符合条件的记录
query执行查询操作,返回结果集游标
rawQuery执行拼接好的SQL查询语句,返回结果集游标
数据库帮助器 (SQLiteOpenHelper)

SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用
使用SQLiteOpenHelper,必须继承SQLiteOpenHelper的数据库操作类,并重写onCreate和 onUpgrade两个方法,需要注意的是读,写DB是两个不同的方法,需要声明两个SQLiteDatabase对象,然后在添加增,删,改,查的方法

package com.example.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

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

public class UserDBHelper extends SQLiteOpenHelper {

    //因为Android的读写DB是两个独立的方法,所以做两个SQLiteDatabase
    private  SQLiteDatabase readDB = null;
    private  SQLiteDatabase writeDB = null;

    //声明一个构造方法来调用父类的构造方法
    //第一个参数是上下文,必须传入
    //第二个参数是DB名字  例如:"TestDB"
    //第三个参数是游标工厂  可以临时设为Null
    //第四个参数是数据库版本号  整数都可以 例如 :1,2,3
    public UserDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //打开数据库的读连接
    public SQLiteDatabase getReadDB(Context context) {
        UserDBHelper userDBHelper = new UserDBHelper(context, "TestDB", null,1);
        readDB = userDBHelper.getReadableDatabase();
        return readDB;
    }

    //打开数据库的写连接
    public SQLiteDatabase getWriteDB(Context context) {
        UserDBHelper userDBHelper = new UserDBHelper(context, "TestDB", null,1);
        writeDB = userDBHelper.getWritableDatabase();
        return writeDB;
    }

    //关闭数据库
    public void close(SQLiteDatabase db) {
        if (db !=null && db.isOpen()) {
            db.close();
        }
    }

    //继承SQLiteOpenHelper以后,需要实现的两个方法onCreate和onUpgrade
    //onCreate   创建数据库
    //onUpgrade  主要用于版本更新
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //创建表的sql文
        String sql = "CREATE TABLE IF NOT EXISTS user (" +
                "id INTEGER," +
                " name VARCHAR NOT NULL," +
                " age VARCHAR NOT NULL" +
                " );";
        //执行sql文
        sqLiteDatabase.execSQL(sql);
    }

    //数据库版本更新的时候,在onUpgrade执行来进行更新
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        //比如给User表增加一个班级(class)列,一次也只能增加一个字段
        String sql = "ALTER TABLE User ADD COLUMN class VARCHAR;";
        sqLiteDatabase.execSQL(sql);
    }

    //插入方法
    public long insert(User user){
        //ContentValues就类似java中的Map
        ContentValues values = new ContentValues();
        values.put("name", user.getName());
        values.put("age", user.getAge());
        //因为插入属于是写入,要用到写连接对象,调用他的insert方法,会返回一个RowID,是一个long类型
        // 方法有三个参数
        // 第一个是表名
        // 第二个是插入列,主要是指当前什么也没插入时,避免error发生,插入一列null,这里因为第三参数有值,可以设为null
        // 第三个是要插入的值
        long rowId = writeDB.insert("User", null, values);
        return rowId;
    }

    //删除方法,返回删除了多少行
    public long delete(User user){
        // 第一个是表名
        // 第二个删除的条件  删除所有,可以用 1=1 最为条件
        // 第三个于条件相匹配的值
        return writeDB.delete("User", "name=? and age=?", new String[]{user.getName(), user.getAge()});
    }

    //更新方法,返回更新了多少行
    public long update(User user){
        ContentValues values = new ContentValues();
        values.put("name", user.getName());
        values.put("age", user.getAge());
        return writeDB.update("User",values, "name=?", new String[]{user.getName()});
    }

    //查询所有行数据
    public List<User> queryAll(){
        List<User> list = new ArrayList<User>();
        //执行查询,返回游标
        Cursor cursor = readDB.query("User",null,null,null,null,null,null);
        //遍历游标
        while (cursor.moveToNext()){
            User user = new User();
            user.setId(cursor.getInt(0));
            user.setName(cursor.getString(1));
            user.setAge(cursor.getString(2));
            list.add(user);
        }
        return list;
    }

    //根据名字查询
    public List<User> queryByName(String name){
        List<User> list = new ArrayList<User>();
        //执行查询,返回游标
        Cursor cursor = readDB.query("User",null,"name=?", new String[]{name},null,null,null);
        //遍历游标
        while (cursor.moveToNext()){
            User user = new User();
            user.setId(cursor.getInt(0));
            user.setName(cursor.getString(1));
            user.setAge(cursor.getString(2));
            list.add(user);
        }
        return list;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值