当前位置:  开发笔记 > 编程语言 > 正文

带有撇号的iPhone SQLite命令

如何解决《带有撇号的iPhoneSQLite命令》经验,为你挑选了1个好方法。

我正在编写一个与SQLite数据库通信的iPhone应用程序,但我遇到了一个小问题.每当我尝试根据包含撇号的条件查询信息时,即使存在与所请求条件匹配的结果,也不会返回任何结果.让我来说明一些细节......

SQLite表


行 - - COLUMN2栏---------

    测试数据 - 001

    用户数据 - 002

Objective-C代码


//Create the sql statement
sqlite3_stmt *sqlStatement;

//Create the name of the category that will be passed in
NSString *categoryName = @"User's Data";

//Create the rest of the SQL query
NSString *sqlQuery = "SELECT * FROM theTableName WHERE Column1 = ?";

//If there are no errors in the SQL query
if (sqlite3_prepare_v2(theDatabase, sqlQuery, -1, &sqlStatement, nil) == SQLITE_OK)
{
    //Bind the category name to the sql statement
    sqlite3_bind_text(sqlStatement, 1, [categoryName UTF8String], -1, SQLITE_TRANSIENT);

    //While there are rows being returned
    while (sqlite3_step(sqlStatement) == SQLITE_ROW)
    {
        //Retrieve row data
    }
}
else
{
    //Save error message to the application log and terminate the app
    NSAssert1(0,@"Error: Failed to prepare the SQL statement with message '%s'.", sqlite3_errmsg(database));
}
//Reset the sql statement
sqlite3_reset(sqlStatement);

我是目标C的半新手,所以在编写这段代码时我首先想到的是清理用户输入.但在做了一些研究之后,我读到sqlite3_bind调用会为你做必要的卫生.但是每当代码运行时,都会跳过while循环,因为没有返回任何行.它应该从数据库表返回第二行.如果我将完全相同的 SQL查询复制/粘贴到SQL管理程序(我使用SQLite Manager)(当然还有必要的查询卫生),它将返回正确的数据.

我花了很长时间尝试自己调试,甚至花更多的时间尝试在线搜索解释和解决的类似问题,但无济于事.截至目前,我刚刚禁用了用户在iPhone的虚拟键盘上键入撇号的功能.但这是我希望包含在我的成品中的一项功能.这里有人能为我提供任何有用的提示吗?任何形式的帮助将不胜感激.



1> Valerii Hior..:

对于sqlite,您的请求将是(因为您可以看到它突出显示错误):

SELECT * FROM theTableName WHERE Column1 = User's data

它将等待结束'符号

你应该回应'符号,例如以下列方式:

NSString *sqlQuery = [NSString stringWithFormat:@"SELECT * FROM tableName WHERE Column1=\"%@\"", categoryName];

在这种情况下查询将是

select * from theTableName where column1="User's data"

这是完全合法的查询.

在这种情况下,您不再需要绑定,最终代码如下所示:

if (sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &sqlStatement, nil) == SQLITE_OK)
{
    //While there are rows being returned
    while (sqlite3_step(sqlStatement) == SQLITE_ROW)
    {
       //Retrieve row data
    }
}
else
{
   //Save error message to the application log and terminate the app
    NSAssert1(0,@"Error: Failed to prepare the SQL statement with message '%s'.", sqlite3_errmsg(database));
}

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有