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

相关推荐
sun0077005 小时前
android ndk编译valgrind
android
AI视觉网奇7 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空7 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet8 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin8 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo030519879 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张11 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
大可门耳13 小时前
Qt的数据库模块介绍,Qt访问SQLite详细示例
数据库·qt·sqlite
柳岸风13 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学13 小时前
安卓原创--基于 Android 开发的菜单管理系统
android