安卓数据存储——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代码案例

相关推荐
起司锅仔5 分钟前
ActivityManagerService Activity的启动流程(2)
android·安卓
峥嵘life14 分钟前
Android14 手机蓝牙配对后阻塞问题解决
android·智能手机
求学者1.024 分钟前
将sqlite3移植到arm开发板上:
arm开发·数据库·sqlite
htx nb27 分钟前
将sqlite3移植到开发板上
数据库·sqlite
chusheng18401 小时前
如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?
数据库·python·sqlite
万兴丶2 小时前
Unnity IOS安卓启动黑屏加图(底图+Logo gif也行)
android·unity·ios
Mr数据杨2 小时前
练习题 - Django 4.x Overviewses 框架概述
数据库·sqlite
茜茜西西CeCe3 小时前
移动技术开发:ListView水果列表
android·java·安卓·android-studio·listview·移动技术开发
OkeyProxy13 小时前
設置Android設備全局代理
android·代理模式·proxy模式·代理服务器·海外ip代理