SQLITE中判断表、字段是否存在的方法

 sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等等信息。

sqlite_master表数据字段:

type:  类型,取值一般为table, view
name:    
tbl_name:   表名
rootpage:

sql:创建表或者视图的sql语句,可以从该sql语句中判断某字段是否存在


sqlite_master表结构如下:

[sql]  view plain  copy
  1. CREATE TABLE sqlite_master (     
  2. type TEXT,     
  3. name TEXT,     
  4. tbl_name TEXT,     
  5. rootpage INTEGER,     
  6. sql TEXT     
  7. );   


例如:

[sql]  view plain  copy
  1. select * from sqlite_master where type = 'table' and name = 't_cmpt_cp'  
sql执行结果是:



1.   查询与判断


查询sqlite中所有表,可用如下sql语句。

[sql]  view plain  copy
  1. select name from sqlite_master where type='table' order by name;  


我们可以通过如下语句查看这个内建表的所有记录:


[sql]  view plain  copy
  1. select * from sqlite_master  

执行结果:



由此可以进一步引申:判断指定的表是否存在,可以用如下语句:


[sql]  view plain  copy
  1. select count(*)  from sqlite_master where type='table' and name = 'yourtablename';  

或者

其中yourtablename表示你要判断的表名,如果查询结果大于0,表示该表存在于数据库中,否则不存在。


2.   查询与判断

通过以下语句可查询出某个表的所有字段信息

PRAGMA  table_info([tablename])

 

比如:我想查看表catalog的所有列信息,可以用下述代码,结果如图所示:

PRAGMA  table_info(t_cmpt_cp)




判断某列是否存在的方法:

方法1:

[java]  view plain  copy
  1. /** 
  2. * 检查表中某列是否存在 
  3. * @param db 
  4. * @param tableName 表名 
  5. * @param columnName 列名 
  6. * @return 
  7. */  
  8. private boolean checkColumnExists2(SQLiteDatabase db, String tableName  
  9.        , String columnName) {  
  10.     boolean result = false ;  
  11.     Cursor cursor = null ;  
  12.   
  13.     try{  
  14.         cursor = db.rawQuery( "select * from sqlite_master where name = ? and sql like ?"  
  15.            , new String[]{tableName , "%" + columnName + "%"} );  
  16.         result = null != cursor && cursor.moveToFirst() ;  
  17.     }catch (Exception e){  
  18.         Log.e(TAG,"checkColumnExists2..." + e.getMessage()) ;  
  19.     }finally{  
  20.         if(null != cursor && !cursor.isClosed()){  
  21.             cursor.close() ;  
  22.         }  
  23.     }  
  24.   
  25.     return result ;  
  26. }  

方法2:

[java]  view plain  copy
  1. /**  
  2.  * 判断某表里某字段是否存在  
  3.  *   
  4.  * @param db  
  5.  * @param tableName  
  6.  * @param fieldName  
  7.  * @return  
  8.  */    
  9. private boolean isFieldExist(SQLiteDatabase db, String tableName, String fieldName) {    
  10.     String queryStr = "select sql from sqlite_master where type = 'table' and name = '%s'";    
  11.     queryStr = String.format(queryStr, tableName);    
  12.     Cursor c = db.rawQuery(queryStr, null);    
  13.     String tableCreateSql = null;    
  14.     try {    
  15.         if (c != null && c.moveToFirst()) {    
  16.             tableCreateSql = c.getString(c.getColumnIndex("sql"));    
  17.         }    
  18.     } finally {    
  19.         if (c != null)    
  20.             c.close();    
  21.     }    
  22.     if (tableCreateSql != null && tableCreateSql.contains(fieldName))    
  23.         return true;    
  24.     return false;    
  25. }    
方法3:

根据 cursor.getColumnIndex(String columnName) 的返回值判断,如果为-1表示表中无此字段

[java]  view plain  copy
  1. /** 
  2. * 检查某表列是否存在 
  3. * @param db 
  4. * @param tableName 表名 
  5. * @param columnName 列名 
  6. * @return 
  7. */  
  8. private boolean checkColumnExist1(SQLiteDatabase db, String tableName  
  9.         , String columnName) {  
  10.     boolean result = false ;  
  11.     Cursor cursor = null ;  
  12.     try{  
  13.         //查询一行  
  14.         cursor = db.rawQuery( "SELECT * FROM " + tableName + " LIMIT 0"  
  15.             , null );  
  16.         result = cursor != null && cursor.getColumnIndex(columnName) != -1 ;  
  17.     }catch (Exception e){  
  18.          Log.e(TAG,"checkColumnExists1..." + e.getMessage()) ;  
  19.     }finally{  
  20.         if(null != cursor && !cursor.isClosed()){  
  21.             cursor.close() ;  
  22.         }  
  23.     }  
  24.   
  25.     return result ;  
  26. }  


 
  

3.   Sqlite中新增、删除、重命名列


3.1   新增一列

方法:使用sql命令

命令:ALTER  TABLE   table-name ADD COLUMN  column-name column-type

例如:在student表中添加一列名为name,类型为varchar:

alter table student add column name varchar;

 alter table catalog add column xxx1 char(20) default '';


3.2   删除一列

方法:由于drop命令在sqlite中不可用于删除列,

alter table student drop column name // 该行在SQlite中不能用,SQlite不支持drop

可采用如下思路,类似于swap()函数的过程。

比如我有表A,A中有x、y、z三列。我要将表A中的x列删掉。那么,

第1步,新建一个表B,B中含有y、z两个字段,且类型与A中的y、z类型相同。

第2步,将A中的所有y、z两列的值拷贝到B中。

上面两步使用一句命令即可完成

create table B as select y,z from A

注意,如果A中y的类型为char,则上面create命令会在B中创建类型为TEXT的y列。即char类型会被改变。

第3步,将A表删除

drop table if exists A

第4步,将B重命名为A

alter table B rename to A


3.3   重命名一列

方法:与删除一列相同,在sqlite中alter同样无法重命名一列。如果想重命名,那么思路与删除一列相同。



4.   Sqlite中新增、删除、重命名表


Sql语句在3.2中已有。整理如下。

4.1   新增表

create table A(id char(20),channeltext,name text,primary key (id))

create table B as select y,z from A


4.2   删除表

drop table if exists A


4.3   重命名表

alter table B rename to A


你可能感兴趣的:(SQLITE中判断表、字段是否存在的方法)