sqlite中的一些知识点

一、 表SQLITE_MASTER说明

  SQLite数据库中一个特殊的名叫 `SQLITE_MASTER` 上执行一个`SELECT`查询以获得所有表的索引。每一个 `SQLite` 数据库都有一个叫 `SQLITE_MASTER` 的表, 它定义数据库的模式。
  `SQLITE_MASTER` 表看起来如下:

      CREATE TABLE sqlite_master (
        type TEXT,
        name TEXT,
        tbl_name TEXT,
        rootpage INTEGER,
        sql TEXT
    );
 对于表来说,`type` 字段永远是 `‘table’`,`name `字段永远是`表的名字`。

二、replace(String tableName,String nullColumnHack,contentValues initialvalues)方法的说明

replace 语句特点:
1. replace语句会删除原有的一条记录,并且插入一条新的记录来替换原记录;
2. replace根据主键的值确定被替换的是那一条记录;
3. 由第二条可知,replace不能根据where子句来定位要被替换的记录;
4. 在执行replace语句时,如果没有要替换的记录,就插入一条新的数据;
5. 一般用replace语句替换一条记录的所有列,如果在replace语句中没有找到指定某列,在replace之后这列的值被置空;
6. 如果新插入的或者替换的记录中,有子弹和表中其他记录冲突,那么会删除那条记录;

三、数据库升级方案

  1. 首先判断数据库是否需要升级

    1. 判断bean中字段个数和数据库中的字段个数是否一样,不一样自然需要升级;
    2. 如果bean中的字段个数和数据库中的字段个数一样,就一一比较bean中每个字段数据库中是否存在,如果有一个不存在就升级数据库;
  2. 如果需要升级,先使用"DROP TABLE IF EXISTS "+tableName先将表删除,然后在重新建表;

    dropdelete的区别:
    drop 用于删除表(表的结构,属性,以及索引都会被删除);
    delete 仅仅是删除表中的数据;

     /**
       * 是否需要升级表
       */
    public static boolean isNeedUpgradeTable(SQLiteDatabase db, TableEntity table) {
      if (!isTableExists(db, table.tableName)) return true;
      Cursor cursor = db.rawQuery("select * from " + table.tableName, null);
      if (cursor == null) return false;
      try {
          int columnCount = table.getColumnCount();
          if (columnCount == cursor.getColumnCount()) {
              for (int i = 0; i < columnCount; i++) {
                if (table.getColumnIndex(cursor.getColumnName(i)) == -1) {
                    return true;
                }
            }
        } else {
            return true;
        }
        return false;
      } finally {
          cursor.close();
      }
    }
    

    其中TableEntity实现:

    public class TableEntity {
    
      public String tableName;           //表名
      private List list;    //所有的表字段
    
      public TableEntity(String tableName) {
          this.tableName = tableName;
          list = new ArrayList<>();
      }
    
      public TableEntity addColumn(ColumnEntity columnEntity) {
          list.add(columnEntity);
          return this;
     }
    
    /** 建表语句 */
    public String buildTableString() {
        StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
        sb.append(tableName).append('(');
        for (ColumnEntity entity : list) {
            if (entity.compositePrimaryKey != null) {
                sb.append("PRIMARY KEY (");
                for (String primaryKey : entity.compositePrimaryKey) {
                  sb.append(primaryKey).append(",");
                }
                sb.deleteCharAt(sb.length() - 1);
              sb.append(")");
          } else {
              sb.append(entity.columnName).append(" ").append(entity.columnType);
            if (entity.isNotNull) {
                sb.append(" NOT NULL");
            }
            if (entity.isPrimary) {
                sb.append(" PRIMARY KEY");
            }
            if (entity.isAutoincrement) {
                sb.append(" AUTOINCREMENT");
            }
            sb.append(",");
          }
      }
      if (sb.toString().endsWith(",")) {
          sb.deleteCharAt(sb.length() - 1);
      }
      sb.append(')');
      return sb.toString();
    }
    
    /**
     * 获取数据库表中列的名字
     *
     * @param columnIndex 列在表中的序号
     * @return 返回列的名字
     */
      public String getColumnName(int columnIndex) {
          return list.get(columnIndex).columnName;
      }
    
    /** 获取数据库表中列的个数 */
     public int getColumnCount() {
        return list.size();
     }
    
        public int getColumnIndex(String columnName) {
          int columnCount = getColumnCount();
          for (int i = 0; i < columnCount; i++) {
            if (list.get(i).columnName.equals(columnName)) return i;
        }
        return -1;
       }
    }
    

你可能感兴趣的:(sqlite中的一些知识点)