一、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);
    }