美文网首页
数据持久化-数据库基础SQLiteOpenHelper

数据持久化-数据库基础SQLiteOpenHelper

作者: Shimmer_ | 来源:发表于2019-11-01 15:42 被阅读0次

    Android基础的SQLite使用

    1. SQLiteOpenHelper

    1. 借助该类实现数据库创建与升级
    2. 通过继承实现该类获取数据库进行数据操作
    方法 描述 备注
    SQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable CursorFactory factory, int version) 构造方法 上下文、数据库名、游标工厂类(默认null)、数据库版本号
    onCreate(SQLiteDatabase db) 创建数据库 使用db执行设计配置好的数据库建表语句进行建表
    onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 升级数据库 根据版本号不同进行升级,发生在App低版本升级数据库结构有改变的情况下

    2. 使用 CRUD Create Retrieve Update Delete

    1.getWritableDatabase()与getReadableDatabase()

    创建或打开一个现有的数据库(如果已存在直接打开,否则创建一个),并返回一个可对数据库进行读写操作的对象;当数据库不可写入时(磁盘空间已满),getWritableDatabase()会出现异常,getReadableDatabase()返回的对象将已只读的方式打开

    2.long insert(String table, String nullColumnHack, ContentValues values)

    插入表名,自动赋值null(用于未指定添加数据的情况下给可空列自动赋值),数据集合

    ContentValues contentValues = new ContentValues(); 
    contentValues.put("name","日常消费");
    contentValues.put("details","饮食#水果#衣物"); 
    DBUtils.insert(DBTables.TABLE_ACCOUNT_SORT,null, contentValues);
    

    3.int delete(String table, String whereClause, String[] whereArgs)

    表名,条件,条件字符串组

    DBUtils.delete(DBTables.TABLE_ACCOUNT_SORT,"name = ?",new String[]{"日常消费"});
    

    4.int update(String table, ContentValues values, String whereClause, String[] whereArgs)

    表名,更新的值集合,条件,条件字符串组

    ContentValues contentValues = new ContentValues();
    contentValues.put("details","饮食#水果#衣物#交通"); 
    DBUtils.update(DBTables.TABLE_ACCOUNT_SORT, contentValues, "name = ?", new String[]{"日常消费"});
    

    5.Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

    查询表名,指定的列名(不指定默认查询所有列,约束条件(约束查询某一行或某几行的数据,默认查询所有行),条件字符串集,指定分组的列(用于获取分组汇总),分组汇总的进一步筛选,查询结果指定排序

       Cursor cursor = DBUtils.query(DBTables.TABLE_ACCOUNT_SORT, null, null, null, null, null, null);
           if (cursor.moveToFirst()) {
               do {
                   String name = cursor.getString(cursor.getColumnIndex("name"));
                   String details = cursor.getString(cursor.getColumnIndex("details"));
                   Log.e(TAG, "name: " + name);
                   Log.e(TAG, "details: " + details);
               }while (cursor.moveToNext());
               cursor.close();
           }
    

    3. 封装

    1. DBHelper

      public class DBHelper extends SQLiteOpenHelper {
          public DBHelper(Context context) {
              super(context, DBTables.DB_NAME, null, DBTables.DB_VERSION);
          }
          @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL(DBTables.ACCOUNT_SQL);
              db.execSQL(DBTables.ACCOUNT_SORT_SQL);
              db.execSQL(DBTables.ACCOUNT_DETAIL_SQL);
          }
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      
          }
      }
      
    2. DBTables

      public interface DBTables {
          String DB_NAME = "db.sqlite";
          int DB_VERSION = 1;
          String TABLE_ACCOUNT = "account";
          String ACCOUNT_SQL = "create table "+TABLE_ACCOUNT+"(" +
                  "id integer primary key autoincrement," +
                  "date varchar(20)," +
                  "sort varchar(10)," +
                  "detail varchar(10)," +
                  "sum varchar(10)," +
                  "source varchar(10)," +
                  "income integer," +
                  "type varchar(10)," +
                  "reason varchar(10)," +
                  "remark varchar(60)" +
                  ")";
          String TABLE_ACCOUNT_SORT = "sort";
          String ACCOUNT_SORT_SQL = "create table "+TABLE_ACCOUNT_SORT+"(" +
                  "name varchar(10) primary key," +
                  "details varchar(100)" +
                  ")";
          String TABLE_ACCOUNT_DETAIL = "detail";
          String ACCOUNT_DETAIL_SQL = "create table "+TABLE_ACCOUNT_DETAIL+"(" +
                  "name varchar(10) primary key," +
                  "budget varchar(100)" +
                  ")";
      }
      
    3. DBUtils

      /**
       * Created by SJ on 2019/1/22.
       * 使用时需要在Application中初始化
       * 查询操作时 需要及时关闭游标与数据库
       */
      public class DBUtils {
          private static DBHelper dbHelper;
          public static void init(Context context) {
              if (dbHelper == null) {
                  dbHelper = new DBHelper(context);
              }
          }
          private static SQLiteDatabase getReadableDatabase() {
              if (dbHelper != null) {
                  return dbHelper.getReadableDatabase();
              }else {
                  throw new SQLException("DBUtils未初始化!");
              }
          }
      
          /**
           * 执行增删改SQL语句
           * @param sql
           */
          public static void execSQL(String sql) {
              SQLiteDatabase db = getReadableDatabase();
              db.execSQL(sql);
              db.close();
          }
      
          /**
           * 执行增删改SQL语句
           * @param sql 带占位符的语句
           * @param bindArgs  实际value
           */
          public static void execSQL(String sql, Object[] bindArgs) {
              SQLiteDatabase db = getReadableDatabase();
              db.execSQL(sql, bindArgs);
              db.close();
          }
          /**
           * @param table 表名
           * @param nullColumnHack 指定为null的列
           * @param values 添加的值集合
           */
          public static void insert(String table, String nullColumnHack, ContentValues values) {
              SQLiteDatabase db = getReadableDatabase();
              db.insert(table,nullColumnHack,values);
              db.close();
          }
      
          /**
           * 删除
           * @param table 表名
           * @param whereClause 删除条件
           * @param whereArgs 条件对应值
           */
          public static void delete(String table, String whereClause, String[] whereArgs) {
              SQLiteDatabase db = getReadableDatabase();
              db.delete(table,whereClause,whereArgs);
              db.close();
          }
      
          /**
           * 修改
           * @param table 表名
           * @param values 需要修改的值
           * @param whereClause 条件
           * @param whereArgs 条件对应值
           */
          public static void update(String table, ContentValues values, String whereClause, String[] whereArgs) {
              SQLiteDatabase db = getReadableDatabase();
              db.update(table, values, whereClause, whereArgs);
              db.close();
          }
      
          /**
           *
           * @param table         String:表名
           * @param columns       String[]:要查询的列名
           * @param selection     String:查询条件
           * @param selectionArgs String[]:查询条件的参数
           * @param groupBy       String:对查询的结果进行分组
           * @param having        String:对分组的结果进行限制
           * @param orderBy       String:对查询的结果进行排序
           * @return 返回游标,使用后需要及时关闭游标
           */
          public static Cursor query(String table, String[] columns, String selection,
                                     String[] selectionArgs, String groupBy, String having,
                                     String orderBy){
              SQLiteDatabase db = getReadableDatabase();
              return db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
          }
      
          /**
           * @param sql 带占位符的查询语句
           * @param selectionArgs 查询条件实际值
           * @return 返回游标,使用后需要及时关闭游标
           */
          public static Cursor rawQuery(String sql, String[] selectionArgs){
              SQLiteDatabase db = getReadableDatabase();
              return db.rawQuery(sql,selectionArgs);
          }
      
          public static void colseDB(){
              dbHelper.close();
          }
      }
      
    4. 使用代码及结果

              ContentValues contentValues = new ContentValues();
              contentValues.put("name", "日常消费");
              contentValues.put("details", "饮食#水果#衣物");
              DBUtils.insert(DBTables.TABLE_ACCOUNT_SORT, null, contentValues);
              contentValues.clear();
              contentValues.put("details", "饮食#水果#衣物#交通");
              DBUtils.update(DBTables.TABLE_ACCOUNT_SORT, contentValues, "name = ?", new String[]{"日常消费"});
              Cursor cursor = DBUtils.query(DBTables.TABLE_ACCOUNT_SORT, null, null, null, null, null, null);
              if (cursor.moveToFirst()) {
                  do {
                      String name = cursor.getString(cursor.getColumnIndex("name"));
                      String details = cursor.getString(cursor.getColumnIndex("details"));
                      Log.e(TAG, "name: " + name);
                      Log.e(TAG, "details: " + details);
                  } while (cursor.moveToNext());
                  cursor.close();
              }
              DBUtils.delete(DBTables.TABLE_ACCOUNT_SORT, "name = ?", new String[]{"日常消费"});
      
      image.png

    相关文章

      网友评论

          本文标题:数据持久化-数据库基础SQLiteOpenHelper

          本文链接:https://www.haomeiwen.com/subject/czafbctx.html