Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLite for iPhone从数据库获取字符串_Iphone_Sqlite - Fatal编程技术网

使用SQLite for iPhone从数据库获取字符串

使用SQLite for iPhone从数据库获取字符串,iphone,sqlite,Iphone,Sqlite,我有一个教程中的代码。我想知道如何修改它,使它从数据库中读取的不是一个double,而是一个字符串 if(detailStmt == nil) { const char *sql = "Select price from Coffee Where CoffeeID = ?"; if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) != SQLITE_OK) NSAssert1(0, @"Er

我有一个教程中的代码。我想知道如何修改它,使它从数据库中读取的不是一个double,而是一个字符串

if(detailStmt == nil) {
    const char *sql = "Select price from Coffee Where CoffeeID = ?";
    if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating detail view statement. '%s'", sqlite3_errmsg(database));
}

sqlite3_bind_int(detailStmt, 1, coffeeID);

if(SQLITE_DONE != sqlite3_step(detailStmt)) {

    //Get the price in a temporary variable.
    NSDecimalNumber *priceDN = [[NSDecimalNumber alloc] initWithDouble:sqlite3_column_double(detailStmt, 0)];

    //Assign the price. The price value will be copied, since the property is declared with "copy" attribute.
    self.price = priceDN;

    //Release the temporary variable. Since we created it using alloc, we have own it.
    [priceDN release];
}
我很确定需要修改的行是:

sqlite3_bind_int(detailStmt, 1, coffeeID);
NSDecimalNumber *priceDN = [[NSDecimalNumber alloc] initWithDouble:sqlite3_column_double(detailStmt, 0)];
我需要使用sqlite3_bind_text和sqlite3_column_text,但我不确定如何正确更改参数


提前感谢您的帮助

==新的更新答案==

我使用SQLLite的方式与您的略有不同。我从未使用过
sqlite3\u bind\u text
我的建议是用我提供的代码段替换您的代码段。我试图让它涵盖你的全部代码。它可能需要调整一两次

下面的解决方案应该适用于所有字段和行。您只需要使用适当的
sqlite3\u column\u text
sqlite3\u column\u double
sqlite3\u column\u int
或在
while(sqlite3\u step(detailStmt)=SQLITE\u ROW)循环中可能需要的其他类型。如果只需要第一行,则可以将while循环更改为
If(sqlite3\u步骤(detailStmt)=SQLITE\u行)


==新的更新答案==

我使用SQLLite的方式与您的略有不同。我从未使用过
sqlite3\u bind\u text
我的建议是用我提供的代码段替换您的代码段。我试图让它涵盖你的全部代码。它可能需要调整一两次

下面的解决方案应该适用于所有字段和行。您只需要使用适当的
sqlite3\u column\u text
sqlite3\u column\u double
sqlite3\u column\u int
或在
while(sqlite3\u step(detailStmt)=SQLITE\u ROW)循环中可能需要的其他类型。如果只需要第一行,则可以将while循环更改为
If(sqlite3\u步骤(detailStmt)=SQLITE\u行)


刚刚意识到。。。编译的声明来自哪里?非常感谢您的耐心,德福!因此,我现在使用的是您代码的更新版本。(除了我必须将所有内容都放在第一个if语句中,因为否则它在prepare语句中无法识别sql。视图现在已加载!但我仍然有一个问题,因为它只对它应该检索的字符串表示null。我放入了一个NSLOG语句,发现它甚至没有进入while循环。您还有其他问题吗出了什么问题?我真的没有这方面的经验,我只是想把它用于一个项目。刚刚弄明白!非常感谢你的帮助!刚刚意识到…compiledStatement从何而来?非常感谢你的耐心,dredful!所以我现在使用你的代码的更新版本。(除了我必须将所有内容都放在第一个if语句中,因为否则它在prepare语句中无法识别sql。视图现在已加载!但我仍然有一个问题,因为它只对它应该检索的字符串表示null。我放入了一个NSLOG语句,发现它甚至没有进入while循环。您还有其他问题吗出了什么问题?我真的没有这方面的任何经验,我只是想把它用于一个项目。刚刚想出来!非常感谢你的帮助!
    if(detailStmt == nil) {
        const char *sql = "Select threadtxt from Coffee Where CoffeeID = ?";
    }    

    if (sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) == SQLITE_OK)
    {
        // loop through the results and add them to the array
        while(sqlite3_step(detailStmt) == SQLITE_ROW) 
        {
            // read the data from the result row
            NSString *nameString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
            self.threadtxt = nameString;
        }   
    } else {
        NSAssert1(0, @"Error while getting the price of coffee. '%s'", sqlite3_errmsg(database));
    }

    // Release the compiled statement from memory
    sqlite3_finalize(detailStmt);