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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android数据存取之Databases 在Android平台上可以操作数据库,这是第一次接触Android时的惊艳之一。在Android平台上,绑定了SQLite数据库,这个数据库系统也是极具性格的,它的最大的应用场景是嵌入式系统,进一步了解可以参看这里。 如果有JDBC的经验,那么在这里会容易的多。Android操作数据库首先要通过一个 类:android.database.sqlite.SQLiteOpenHelper。它封装了如何打开一个数据库,其当然也包含如果数据库不存在 就创建这样的逻辑。看一个例子: view plaincopy to clipboardprint? 1. pubilc class DatabaseHelper extends SQLiteOpenHelper { 2. private static final String DATABASE_NAME = "com.roiding.simple.note"; 3. private static final int DATABASE_VERSION = 1; 4. private static final String NOTES_TABLE_NAME = "notes"; 5. 6. DatabaseHelper(Context context) { 7. super(context, DATABASE_NAME, null, DATABASE_VERSION); 8. } 9. 10. @Override 11. public void onCreate(SQLiteDatabase db) { 12. db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME 13. + " (id integer primary key autoincrement, name text);"); 14. } 15. 16. @Override 17. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 18. db.execSQL("DROP TABLE IF EXISTS notes"); 19. onCreate(db); 20. } 21. } 这里面,如下的语句需要解释: • super(context, DATABASE_NAME, null, DATABASE_VERSION) 数据库连接的初始化,间的那个null,是一个CursorFactory参数,没有仔细研究这个参数,暂时置空吧。 • public void onCreate(SQLiteDatabase db) 这里面的onCreate是指数据库onCreate时,而不是DatabaseHelper的onCreate。也就是说,如果已经指定 database已经存在,那么在重新运行程序的时候,就不会执行这个方法了。要不然,岂不是每次重新启动程序都要重新创建一次数据库了!在这个方法,完成了数据库的创建工作。也就是那个execSQL()方法。 • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 在程序的开发维护过程,数据库的结构可能会有变化,那么这个方法就有用处了。在DatabaseHelper这个对象一创建时,就已经把参数 DATABASE_VERSION传入,这样,如果Android发现此版本与现有版本不一致,就会调用这个onUpgrate方法。于是,可以在这里面实现一些数据的upgrade工作,比如说创建一个临时,将数据由临时转到新的结构。需要注意的是,这里面的onUpgrade是在版本不一致时调用,也就是说不管当前需要的版本高于现有版本还是低于现有版本,都会出发这个方法,类似的这种情况,就需要对oldVersion和 newVersion进行判断之后再决定使用什么策略来更新数据。 在Android,数据库存放在 /data/data/PACKAGE_NAME/databases 目录下。 接下来就可以使用这个Helper来操作数据库了,操作数据库也就无非是增、删、改、查。先看一个增的例子: view plaincopy to clipboardprint? 1. public static void insert(Context context, String s) { 2. DatabaseHelper

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值