检查列是不是已存在,如果不存在,则在 sqlite 中更改表
Posted
技术标签:
【中文标题】检查列是不是已存在,如果不存在,则在 sqlite 中更改表【英文标题】:Check If column already exist and if not Alter Table in sqlite检查列是否已存在,如果不存在,则在 sqlite 中更改表 【发布时间】:2012-04-15 20:02:39 【问题描述】:我想在我的应用中更改一个 sqlite 表。
现在,我想检查该列是否已存在于我的表中?
因此,如果不存在,我想使用 alter table syntex 添加该列。
目前我正在使用。
-(void) alterDB
sqlite3_stmt *statement;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
NSString *updateSQL = [NSString stringWithFormat: @"ALTER TABLE diagramInfo ADD COLUMN testColumn VARCHAR"];
const char *update_stmt = [updateSQL UTF8String];
sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL);
if(sqlite3_step(statement)==SQLITE_DONE)
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DB altered" message:@"Success" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
alert=nil;
else
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DB Updation" message:@"DB not Altered" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
alert=nil;
// Release the compiled statement from memory
sqlite3_finalize(statement);
sqlite3_close(database);
【问题讨论】:
【参考方案1】:使用以下函数检查列是否存在。实际上未检查,因此您可能必须检查语法。概念就像如果您能够创建准备好的语句而不是列存在,否则不存在。
-(BOOL)checkColumnExists
BOOL columnExists = NO;
sqlite3_stmt *selectStmt;
const char *sqlStatement = "select yourcolumnname from yourtable";
if(sqlite3_prepare_v2(yourDbHandle, sqlStatement, -1, &selectStmt, NULL) == SQLITE_OK)
columnExists = YES;
return columnExists;
斯威夫特 3.2:
private func tableHasColumn(db: OpaquePointer, tableName: String, columnName: String) -> Bool
var retVal = false
var tableColumnsQueryStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, "PRAGMA table_info(\(tableName));",
-1,
&tableColumnsQueryStatement,
nil) == SQLITE_OK
while (sqlite3_step(tableColumnsQueryStatement) == SQLITE_ROW)
let queryResultCol1 = sqlite3_column_text(tableColumnsQueryStatement, 1)
let currentColumnName = String(cString: queryResultCol1!)
if currentColumnName == columnName
retVal = true
break
return retVal
【讨论】:
【参考方案2】:PRAGMA table_info(table-name);
此 Pragma 用于获取表中的列列表。
For more details, visit here
- (BOOL)checkForField
NSString *desiredColumn = @"tblName";
const char *sql = "PRAGMA table_info(tblTest)";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK)
return NO;
while(sqlite3_step(stmt) == SQLITE_ROW)
NSString *fieldName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
if([desiredColumn isEqualToString:fieldName])
return YES;
return NO;
【讨论】:
别忘了完成声明!以上是关于检查列是不是已存在,如果不存在,则在 sqlite 中更改表的主要内容,如果未能解决你的问题,请参考以下文章
SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users