为什么会报SQLite语法错误

Why is SQLite syntax error reported

我有一个包含 SQLite 数据库的应用程序。我创建了 table 并将值插入到 table 中,但是当我从 table 获取数据时,它给我的错误是

near "Dhanani": syntax error

这里是我的取数据方法:

-(void)getTextFromDb
{
    NSLog(@"Method Called");
    NSString *docsDir;
    NSArray *dirPaths;
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = dirPaths[0];

    _databasePath = [[NSString alloc]
                     initWithString: [docsDir stringByAppendingPathComponent:
                                      @"QpinData.db"]];
    const char *dbpath = [_databasePath UTF8String];
    sqlite3_stmt    *statement;
    if (sqlite3_open(dbpath, &_myDatabase) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat:@"SELECT QpinName,Address,Lat,Long,Type FROM QPINTABLE WHERE UserName=Ramesh Dhanani"];
        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(_myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            [self.qpinname removeAllObjects];
            [self.qpinType removeAllObjects];
            [self.address removeAllObjects];
            [self.latitude removeAllObjects];
            [self.longitude removeAllObjects];
            while (sqlite3_step(statement) == SQLITE_ROW)
            {
                NSString *QpinName = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)];
                NSString *Address = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];
                NSString *latitude = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)];
                NSString *longitude = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 3)];
                NSString *Type = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 4)];
                [self.qpinname addObject:[NSString stringWithFormat:@" %@ ", QpinName]];
                [self.address addObject:[NSString stringWithFormat:@"%@ ",Address]];
                NSLog(@"self.address %@",self.address);
                [self.latitude addObject:[NSString stringWithFormat:@"%@",latitude]];
                [self.latitude addObject:[NSString stringWithFormat:@" %@",longitude]];
                [self.qpinType addObject:[NSString stringWithFormat:@" %@",Type]];
            }
            NSLog(@"%s",sqlite3_errmsg(_myDatabase));
            sqlite3_finalize(statement);
        }
        NSLog(@"%s",sqlite3_errmsg(_myDatabase));
        sqlite3_close(_myDatabase);
        [self.personalTable reloadData];
    }
}

如有任何帮助,我们将不胜感激。

你必须使用,
NSString *querySQL = [NSString stringWithFormat:@"SELECT QpinName,Address,Lat,Long,Type FROM QPINTABLE WHERE UserName='Ramesh Dhanani'"];

因为查询中的任何字符串都必须用单引号引起来。

您的 SQL 中有一个值未被引用。所以你要么:

  1. 在用户名值两边加上引号:

    NSString *querySQL = @"SELECT QpinName,Address,Lat,Long,Type FROM QPINTABLE WHERE UserName='Ramesh Dhanani'";
    
  2. 如果用户名可以更改,您需要在 SQL 中使用 ? 占位符,然后使用 sqlite3_bind_text:[= 绑定一个值15=]

    -(void)getTextFromDb
    {
        NSString *docsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];            
        NSString *path = [docsDir stringByAppendingPathComponent:@"QpinData.db"];
        const char *dbpath = [path UTF8String];
    
        sqlite3_stmt    *statement;
        if (sqlite3_open(dbpath, &_myDatabase) == SQLITE_OK) {
            const char *query_stmt = "SELECT QpinName,Address,Lat,Long,Type FROM QPINTABLE WHERE UserName=?";
    
            if (sqlite3_prepare_v2(_myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
                if (sqlite3_bind_text(statement, 1, [self.username UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) {
                    NSLog(@"problem binding value: %s", sqlite3_errmsg(_myDatabase));
                }
    
                // clear out the model objects
    
                while (sqlite3_step(statement) == SQLITE_ROW) {
                    NSString *qpinName = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)];
                    NSString *address = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];
                    NSString *latitude = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)];
                    NSString *longitude = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 3)];
                    NSString *type = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 4)];
    
                    // populate the model objects
                }
                sqlite3_finalize(statement);
            }
            sqlite3_close(_myDatabase);
            [self.personalTable reloadData];
        }
    }