是否可以在SQLite中的一个查询中执行两个或更多select语句?例如,
我们可以执行创建或插入查询,
NSString *create_query = @"create table if not exists Employee (id integer primary key, firstName text, lastName text);create table if not exists Department (id integer primary key, department text, devision text)";
使用,
sqlite3_exec(self.contactDB,[create_query UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK)
我们可以执行它。
但如果查询类似,
NSString *select_query = @"select * from Employee;select * from Department";
那么可以执行吗?如果是,那么如何区分sqlite3_step
的数据?
通常我们会提取数据,
if (sqlite3_prepare_v2(self.contactDB, [select_query UTF8String], -1, &statement, NULL) == SQLITE_OK) {
NSLog(@"prepared from data get");
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *department = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 1)];
NSString *devision = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)];
NSLog(@"Department : %@, Devision : %@",department,devision);
}
NSLog(@"errror1 is %s",sqlite3_errmsg(self.contactDB));
}
但如果有两个select语句,那么如何识别sqlite3_step
中的列和行?
我们可以在终端中一起执行两个select语句(即select * from Employee; select * from Department),所以我认为它应该在iOS中的某种方式。
答案 0 :(得分:2)
是的,您可以使用sqlite3_exec()
在一次调用中执行两个SELECT语句。您只需提供一个回调函数来处理结果行。我从来没有使用过这个功能,以及我如何理解你自己的文档以区分每个语句的行;也许可以使用列计数。
我建议不要那样使用sqlite3_exec()
;它似乎相当乏味且容易出错。 sqlite3_prepare_*()
应该是可行的方法,它只能处理一个结果集(SELECT查询),但您可以一次打开多个语句,由ppStmt
句柄表示。如果您遇到问题,则应该对其进行描述,而不是发布XY Problem个问题。
答案 1 :(得分:0)
我们可以通过使用带有callback
的C样式sqlite3_exec
函数来执行此操作。
互联网上没有适当的代码(我还没找到!)所以我想用代码示例回答。
我们可以实施像
这样的C - style callback
方法
int myCallback(void *parameter, int numberOfColumn, char **resultArr, char **column)
{
NSLog(@"number of column %d",numberOfColumn); // numberOfColumn is return total number of column for correspond table
NSString *columnName = [[NSString alloc]initWithUTF8String:column[0]]; // This will return column name column[0] is for first, column[1] for second column etc
NSLog(@"column name is %@",columnName);
NSString *result = [[NSString alloc]initWithUTF8String:resultArr[2]]; // resultArr returns value for row with respactive column for correspond table. resultArr[2] considered as third column.
NSLog(@"result is %@",result);
return 0;
}
我们可以在sqlite3_exec
函数中调用此回调函数,如
NSString *getData = @"select * from Department;select * from Employee";
if (sqlite3_exec(self.contactDB, [getData UTF8String], myCallback, (__bridge void *)(self), &err) == SQLITE_OK ) {
if (err) {
NSLog(@"error : %s",err);
}
else {
NSLog(@"executed sucessfully");
}
}
我们让新娘:(__bridge void *)(self)
作为sqlite3_exec
的参数。在这种情况下我们可以传递NULL
,因为我们已经实现了c样式函数。但是如果我们实现Objective-c样式函数或方法,那么我们必须将(__bridge void *)(self)
作为参数传递。
因此,通过回调函数,我们可以在一个语句中执行多个queries
,无论是select
类型查询还是其他。