【问题标题】:Sqlite3 step == SQLITE_ROW not working for meSqlite3 步骤 == SQLITE_ROW 不适合我
【发布时间】:2014-01-25 19:17:54
【问题描述】:

由于我是 Xcode 的新手,所以不知道如何解决这个问题。请帮我弄清楚实际问题。

数据库连接已建立,查询已执行,但我总是收到以下消息:执行查询后未找到结果。 :(

- (void)viewDidLoad
{
    NSString *MyDirectory;
    NSArray *DirectoryPaths;
    // Get the documents directory
    DirectoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    MyDirectory = [DirectoryPaths objectAtIndex:0];
    // Build the path to the database file
    MyDBPath = [[NSString alloc]initWithString: [MyDirectory stringByAppendingPathComponent:@"mydb.db"]];
    //Status.text = MyDBPath;
    const char *Database = [MyDBPath UTF8String];
    if (sqlite3_open(Database, &MyConnection) == SQLITE_OK)
    {
        Status.text = @"Build Connection Successfully...!";
    }
    else
    {
        Status.text = @"Failed to open database...!";
    }
    [super viewDidLoad];
}


- (void) Find
{
    const char *Database = [MyDBPath UTF8String];
    sqlite3_stmt    *SQLStatement;
    NSString *Query;
    if (sqlite3_open(Database, &MyConnection) == SQLITE_OK)
    {
        Query = [NSString stringWithFormat:@"SELECT EmpName FROM EmpLogin WHERE          EmpID=\"%@\"",MyText.text];
        if (sqlite3_prepare_v2(MyConnection, [Query UTF8String], 0, &SQLStatement, nil) == SQLITE_OK)
        {
            while (sqlite3_step(SQLStatement) == SQLITE_ROW)
            {
                NSString *Name = [[NSString alloc]
                                  initWithUTF8String:(const char *) sqlite3_column_text(SQLStatement, 0)];
                TextResult.text = Name;
            }
            if (TextResult.text.length > 0)
            {
                Status.text = @"Result found";
            }
            else
            {
                NSLog(@"%s", sqlite3_errmsg(MyConnection));
                Status.text = @"Result not found";
                TextResult.text = @"";
            }
            sqlite3_finalize(SQLStatement);
        }
        else
        {
            //NSString *decode = [[NSString alloc]initWithCString:Query_Stmt encoding:NSUTF8StringEncoding];
            //Status.text = decode;
            Status.text = @"Query execution Failed...!";
        }
        sqlite3_close(MyConnection);
    }
}

Sqlite3_step(SQLStatement) == SQLITE_ROW __ 也不工作

【问题讨论】:

    标签: objective-c sqlite


    【解决方案1】:

    是的,我解决了这个问题……!!!! 实际上我只是将目录的路径更改为指向我的数据库路径。 这是我的最终和工作代码……无论如何,谢谢@HotLicks,,,@CL。 :) :)

    这就像一个魅力...... :)


    - (void) Find
    {
    MyDBPath = @"/Users/zaibi/Documents/IOSProjects/mydb.db";
    MyDatabase = [MyDBPath UTF8String];
    sqlite3_stmt    *SQLStatement;
    NSString *Query;
    //NSString *decode = [[NSString alloc]initWithCString:Database encoding:NSUTF8StringEncoding];
    //NSLog(@"%@",decode);
    if (sqlite3_open(MyDatabase, &MyConnection) == SQLITE_OK)
    {
        Query = [NSString stringWithFormat:@"SELECT EmpName FROM EmpLogin WHERE EmpID=\"%@\"",MyText.text];
        if (sqlite3_prepare_v2(MyConnection, [Query UTF8String], -1, &SQLStatement, nil) == SQLITE_OK)
        {
            if (sqlite3_step(SQLStatement) == SQLITE_ROW)
            {
                NSString *Name = [[NSString alloc]
                                  initWithUTF8String:(const char *) sqlite3_column_text(SQLStatement, 0)];
                TextResult.text = Name;
                Status.text = @"Result found";
            }
            else
            {
                NSLog(@"%s", sqlite3_errmsg(MyConnection));
                Status.text = @"Result not found";
                TextResult.text = @"";
            }
            sqlite3_finalize(SQLStatement);
        }
        else
        {
            NSLog(@"%s", sqlite3_errmsg(MyConnection));
            Status.text = @"Query execution Failed...!";
        }
        sqlite3_close(MyConnection);
    }
    

    }


    虽然这种访问数据库的方式令人困惑……:/

    NSString *MyDirectory;
    NSArray *DirectoryPaths;
    // Get the documents directory
    DirectoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    MyDirectory = [DirectoryPaths objectAtIndex:0];
    // Build the path to the database file
    MyDBPath = [[NSString alloc]initWithString: [MyDirectory stringByAppendingPathComponent:@"mydb.db"]];
    //Status.text = MyDBPath;
    

    【讨论】:

    • 请记住,您不能使用 DB 的该路径在手机上运行您的应用程序——您必须在应用程序的读/写目录中分配数据库。这就是为什么在您看到的示例中使用整个 NSSearchPath... 的原因。但是当然,如​​果你想预先创建数据库,你必须将预先创建的版本放在你的包中,并在你第一次运行应用程序时将其复制到读/写空间。 (网上有很多这样的例子——大约有 20 行代码序列。)
    • @HotLicks 哦,不...... :'(你的意思是说我必须将可能的数据库复制到那个目录......。这是应用程序之前拍摄的...... ????
    • 如果您想拥有一个“预加载”数据库,那么可以,您需要在您的应用程序中包含“首次通过”逻辑,以将数据库从捆绑包复制到可写文件系统。
    • @HotLicks 我该怎么做...??请告诉我将预先创建的数据库添加到确切誓言的正确方法。提前致谢。 ;)
    • 如果您搜索它们,这里很容易找到十几个相应代码的示例。
    【解决方案2】:

    有时阅读the documentation会有所帮助:

    如果 nByte 参数小于零,则 zSql 被读取到 第一个零终止符。如果 nByte 是非负数,那么它是 从 zSql 读取的最大字节数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多