如何在iOS中的sqlite中的一个查询中执行多个select语句?

时间:2016-06-08 13:55:02

标签: ios objective-c sqlite

是否可以在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中的某种方式。

2 个答案:

答案 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类型查询还是其他。

参考:One-Step Query Execution Interface