一、 表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. 如果新插入的或者替换的记录中,有子弹和表中其他记录冲突,那么会删除那条记录;
三、数据库升级方案
-
首先判断数据库是否需要升级
- 判断
bean
中字段个数和数据库中的字段个数是否一样,不一样自然需要升级; - 如果
bean
中的字段个数和数据库中的字段个数一样,就一一比较bean中每个字段数据库中是否存在,如果有一个不存在就升级数据库;
- 判断
-
如果需要升级,先使用
"DROP TABLE IF EXISTS "+tableName
先将表删除,然后在重新建表;drop
和delete
的区别:
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; } }