美文网首页
sqlite中的一些知识点

sqlite中的一些知识点

作者: VictorBXv | 来源:发表于2018-03-22 23:41 被阅读0次

    一、 表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<ColumnEntity> 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中的一些知识点

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