Sqlite3_step()保持对此查询返回SQLITE_MISUSE。任何指针? [英] Sqlite3_step() keeps returning SQLITE_MISUSE on this query. Any pointers?

查看:1122
本文介绍了Sqlite3_step()保持对此查询返回SQLITE_MISUSE。任何指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在viewDidLoad例程中打开一个sqlite数据库,并尝试发送一个sql查询到db,但sqlite_step()每次都失败。我不知道这里有什么问题。我只是尝试这是一个hello世界尝试sqlite3。

  #importRootViewController.h
#import sqlite3.h

static sqlite3_stmt * statement = nil;

@implementation RootViewController

- (void)viewDidLoad {
[super viewDidLoad];
NSString * dbname = @name.sqlite;
sqlite3 * database;
int success;

//取消注释以下行以在此视图控制器的导航栏中显示编辑按钮。
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:dbname];
//打开数据库。数据库是在应用程序外部准备的。
success = sqlite3_open([path UTF8String],& database);
if(success == SQLITE_OK){
NSLog(@数据库打开成功:%d,成功);
} else {
//即使打开失败,调用close以正确清理资源。
sqlite3_close(database);
NSLog(@数据库打开失败:%d,成功);
//额外的错误处理,适当的...
}
if(statement == nil){
const char * sql =insert into name(nid,name) values(6,'testname');;
success = sqlite3_prepare_v2(database,sql,-1,& statement,NULL);
NSLog(@query prepare status:%d,success);
if(success!= SQLITE_OK){
}
}

success = sqlite3_step(statement); //这里的事情失败,因为所有调用返回ok
NSLog(@query step status:%d,success);
if(success!= SQLITE_DONE){
}
sqlite3_reset(statement);
sqlite3_close(database);
}
...

在哪里我可能是错的。感谢您的时间。

解决方案

我这样做,但它仍然不工作,因为没有什么显示在控制台。

 
#importRootViewController.h
#importFMDatabase.h

@实现RootViewController

- (void)viewDidLoad {
[super viewDidLoad];
NSString * dbname = @name.sqlite;
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:dbname];
FMDatabase * database = [FMDatabase databaseWithPath:path];
FMResultSet * rs = [database executeQuery:@select * from name;];
while([rs next]){
NSLog(@%d%@,
[rs intForColumn:@nid],
[rs stringForColumn:@名称]);
}
[database close];
}
...

对不起,但无法使用代码块,因此再次使用pre 。



编辑:当我在FMDB中打开日志时,像这样:

 
FMDatabase * database = [FMDatabase databaseWithPath:path];

[database setLogsErrors:YES];

if(![database open]){
NSLog(@无法打开db。
} else {
NSLog(@DB Open ....);
}
FMResultSet * rs = [database executeQuery:@select * from'name';];
while([rs next]){
//只是打印出我们有多种格式。
NSLog(@%d%@,
[rs intForColumn:@nid],
[rs stringForColumn:@name]);
}
[database close];

...,我在控制台中看到:

 
[session started at 2010-09-07 15:38:16 +0530。]
2010-09-07 15:38:19.178 MyDBTry [13670:207] DB打开....
2010-09-07 15:38:19.181 MyDBTry [13670:207] DB错误:1没有这样的表:名称
2010-09-07 15:38:19.182 MyDBTry [13670:207] DB查询:select * from name;


I am trying to open a sqlite db in the viewDidLoad routine and trying to send a sql query through to the db, but the sqlite_step() fails every time. I am not sure what's wrong here. I am just trying this as a hello world attempt at sqlite3.

#import "RootViewController.h"
#import "sqlite3.h"

static sqlite3_stmt *statement = nil;

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *dbname = @"name.sqlite";
    sqlite3 *database;
    int success;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:dbname];
    // Open the database. The database was prepared outside the application.
    success = sqlite3_open([path UTF8String], &database);
    if (success == SQLITE_OK) {
        NSLog(@"database opening successful : %d", success);
    } else {
        // Even though the open failed, call close to properly clean up resources.
        sqlite3_close(database);
        NSLog(@"database opening failed : %d", success);
        // Additional error handling, as appropriate...
    }
    if (statement == nil) {
        const char *sql = "insert into name(nid, name) values(6, 'testname');";
        success = sqlite3_prepare_v2(database, sql, -1, &statement, NULL);
        NSLog(@"query prepare status: %d", success);
        if (success != SQLITE_OK) {
        }
    }

    success = sqlite3_step(statement); //things fail here, as all calls above return ok
    NSLog(@"query step status: %d", success);
    if (success != SQLITE_DONE) {
    }
    sqlite3_reset(statement);
    sqlite3_close(database);
}
...

It would be great if anyone could point me out where I might be wrong. Thanks for your time already.

解决方案

I did this but it still doesn't work, as in nothing shows up in the Console.

#import "RootViewController.h"
#import "FMDatabase.h"

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *dbname = @"name.sqlite";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:dbname];
    FMDatabase * database = [FMDatabase databaseWithPath:path];
    FMResultSet *rs = [database executeQuery:@"select * from name;"];
    while ([rs next]) {
        NSLog(@"%d %@",
              [rs intForColumn:@"nid"],
              [rs stringForColumn:@"name"]);
    }
    [database close];
}
...

And sorry but am unable to use the code block, so using a pre again.

Edit: When I turn logging on in FMDB, like this:

    FMDatabase * database = [FMDatabase databaseWithPath:path];

    [database setLogsErrors:YES];

    if (![database open]) { 
        NSLog(@"Could not open db."); 
    } else { 
        NSLog(@"DB Open...."); 
    }
    FMResultSet *rs = [database executeQuery:@"select * from 'name';"];
    while ([rs next]) {
        // just print out what we've got in a number of formats.
        NSLog(@"%d %@",
              [rs intForColumn:@"nid"],
              [rs stringForColumn:@"name"]);
    }
    [database close];

..., I get this in the Console:

[Session started at 2010-09-07 15:38:16 +0530.]
2010-09-07 15:38:19.178 MyDBTry[13670:207] DB Open....
2010-09-07 15:38:19.181 MyDBTry[13670:207] DB Error: 1 "no such table: name"
2010-09-07 15:38:19.182 MyDBTry[13670:207] DB Query: select * from name;

这篇关于Sqlite3_step()保持对此查询返回SQLITE_MISUSE。任何指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆