安卓数据存储——SQLite

一、SQLite数据库

创建表

sql 复制代码
	CREATE TABLE IF NOT EXISTS user_info (
		_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
		name VARCHAR NOT NULL,
		age INTEGER NOT NULL,
		height LONG NOT NULL,
		weight FLOAT NOT NULL
	);
注:
  • IF NOT EXISTS:如果该表不存在则创建,若存在该表则不创建
  • AUTOINCREMENT:自动增长
  • sqlite数据库不支持布尔类型,如果直接存布尔类型会被自动转为数字 0(false)、1(true)

删除表

sql 复制代码
	DROP TABLE IF EXISTS user_info;
注:
  • IF EXISTS:如果该表存在则删除

修改表结构

sql 复制代码
	ALTER TABLE user_info ADD COLUMN phone VARCHAR;
注:
  • sqlite只支持增加字段,不支持修改、删除字段
  • sqlite每次只能添加一个字段,若要添加多个字段,需分多次添加

添加记录

sql 复制代码
	INSERT INTO user_info ( name, age, height, weight, phone )
	VALUES
		( '张三', 18, 180, 70.2, 1101201120 );

删除记录

sql 复制代码
	DELETE 
	FROM
		user_info 
	WHERE
		name = '张三';

修改记录

sql 复制代码
	UPDATE user_info 
	SET height = 188 
	WHERE
		name = '张三';

查询记录

sql 复制代码
	SELECT * FROM user_info ORDER BY age ASC;
注:

ORDER BY :根据age字段排序
ASC :升序
DESC:降序

二、SQLiteDatabase数据库管理器

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

管理类主要API

  • openDatabase:打开指定路径的数据库
  • isOpen:判断数据库是否已打开
  • close:关闭数据库
  • getVersion:获取数据库的版本号
  • setVersion:设置数据库的版本号

创建数据库

java 复制代码
String mDatabaseName = getFilesDir() + "/test.db";
SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE, null);

删除数据库

java 复制代码
boolean result = deleteDatabase(mDatabaseName);

案例代码

注:
  • getFilesDir() :返回该包下的files路径(/data/data/包名/files/)

三、SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。

数据处理类主要API

  • execSQL:执行拼接好的SQL语句
  • delete:删除符合条件的记录
  • update:更新符合条件的记录
  • insert:插入一条记录
  • query:执行查询操作,返回结果集的游标
  • rawQuery:执行拼接好的SQL查询语句,返回结果集的游标

创建步骤

  • 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
  • 封装保证数据库安全的必要方法
  • 提供对表记录进行增加、删除、修改、查询的操作方法。
java 复制代码
public class UserDBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "user.db";
    private static final String TABLE_NAME = "user_info";
    private static final int DB_VERSION = 1;

    private static UserDBHelper mHelper = null;
    private SQLiteDatabase mRDB = null;
    private SQLiteDatabase mWDB = null;

    private UserDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    //单例
    public static UserDBHelper getInstance(Context context) {
        if (mHelper == null) {
            mHelper = new UserDBHelper(context);
        }
        return mHelper;
    }
}

在onCreate中创建表

java 复制代码
    // 创建数据库,执行建表语句
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "name VARCHAR NOT NULL);";
        db.execSQL(sql);
    }

SQLiteDatabase对数据库操作分为读和写,所以要提供两个实例

java 复制代码
    private SQLiteDatabase mRDB = null;
    private SQLiteDatabase mWDB = null;

读连接:getReadableDatabase()

java 复制代码
    public SQLiteDatabase openReadLink() {
        if (mRDB == null || !mRDB.isOpen()) {
            mRDB = mHelper.getReadableDatabase();
        }
        return mRDB;
    }

写连接:getWritableDatabase()

java 复制代码
    public SQLiteDatabase openWriteLink() {
        if (mWDB == null || !mWDB.isOpen()) {
            mWDB = mHelper.getWritableDatabase();
            return mWDB;
        }
        return mWDB;
    }

关闭连接

java 复制代码
    public void closeLink() {
        if (mRDB != null && mRDB.isOpen()) {
            mRDB.close();
            mRDB = null;
        }
        if (mWDB != null && mWDB.isOpen()) {
            mWDB.close();
            mWDB = null;
        }
    }

添加

java 复制代码
    public long insert(User user) {
        ContentValues values = new ContentValues();
        values.put("name", user.name);
		//执行插入记录动作,该语句返回插入记录的行号
		//如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,
		//为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),
		//倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。
		//如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。
        return mWDB.insert(TABLE_NAME, null, values);
    }

删除

java 复制代码
    public long deleteByName(User user) {
//        删除多个 name=? and age=?
//        删除所有 1=1
        return mWDB.delete(TABLE_NAME, "name=?", new String[]{user.name});
    }

修改

java 复制代码
    public long update(User user) {
        ContentValues values = new ContentValues();
        values.put("name", user.name);
        return mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name});
    }

查询

java 复制代码
    public List<User> queryAll() {
        List<User> list = new ArrayList<>();
        Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null);
        
        while (cursor.moveToNext()) {
            User user = new User();
            user.id = cursor.getInt(0);
            user.name = cursor.getString(1);
            list.add(user);
        }
        return list;
    }
注:
  • Cursor:游标

使用

java 复制代码
public class SQLiteHelperActivity extends : {
    private UserDBHelper mHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite_helper);

        Button save = findViewById(R.id.save);

        save.setOnClickListener(view -> {
            User user = new User("张三");
//            插入
//            long res = mHelper.insert(user);

//            删除
//            long res = mHelper.deleteByName(user);

//            修改
//            long res = mHelper.update(user);

//            查询
            List<User> list=mHelper.queryAll();
            
            for(User u: list){
                Log.d("AAA",u.toString());
            }
          	if (res > 0) {
               ToastUtil.show(this, "success");
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        mHelper = UserDBHelper.getInstance(this);
//        打开数据库读写连接
        mHelper.openWriteLink();
        mHelper.openReadLink();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mHelper.closeLink();
    }
}

事务

事务类主要API

  • beginTransaction:开始事务
  • setTransactionSuccessful:设置事务的成功标志
  • endTransaction:结束事务
java 复制代码
    public long insert(User user) {
        ContentValues values = new ContentValues();
        values.put("name", user.name);
        try {
            //开始一个事务
            mWDB.beginTransaction();

            mWDB.insert(TABLE_NAME, null, values);
            mWDB.insert(TABLE_NAME, null, values);
            
            //标记事务成功
            mWDB.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //标记事务结束        
            mWDB.endTransaction();
        }
        return 1;
    }

数据库更新

java 复制代码
	private static final int DB_VERSION = 1;
	
    private UserDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

当 DB_VERSION 改变时给表添加两个字段

java 复制代码
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;";
        db.execSQL(sql);
        sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN password VARCHAR;";
        db.execSQL(sql);
    }

UserDBHelper代码案例

相关推荐
编程洪同学1 小时前
Spring Boot 中实现自定义注解记录接口日志功能
android·java·spring boot·后端
氤氲息3 小时前
Android 底部tab,使用recycleview实现
android
Clockwiseee4 小时前
PHP之伪协议
android·开发语言·php
小林爱4 小时前
【Compose multiplatform教程08】【组件】Text组件
android·java·前端·ui·前端框架·kotlin·android studio
好学近乎知o4 小时前
常用的Django模板语言
python·django·sqlite
小何开发5 小时前
Android Studio 安装教程
android·ide·android studio
开发者阿伟5 小时前
Android Jetpack LiveData源码解析
android·android jetpack
weixin_438150995 小时前
广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
android·单片机
CheungChunChiu6 小时前
Android10 rk3399 以太网接入流程分析
android·framework·以太网·eth·net·netd
木头没有瓜7 小时前
ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
android·java·okhttp