Sqlite3_step () продолжает возвращать SQLITE_MISUSE для этого запроса.Есть указатели? - PullRequest
0 голосов
/ 06 сентября 2010

Я пытаюсь открыть базу данных sqlite в подпрограмме viewDidLoad и пытаюсь отправить запрос sql через базу данных, но sqlite_step () каждый раз терпит неудачу.Я не уверен, что здесь не так.Я просто пробую это как попытку приветствовать мир на 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);
}
...

Было бы замечательно, если бы кто-нибудь мог указать мне, где я могу ошибаться.Спасибо за ваше время уже.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2010

Я сделал это, но он все еще не работает, поскольку в консоли ничего не отображается.

#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];
}
...

И извините, но я не могу использовать блок кода, поэтому снова использую pre.

Редактировать: Когда я включаю вход в FMDB, вот так:

    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];

..., я получаю это в консоли:

[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;
0 голосов
/ 06 сентября 2010

Подтвердили ли вы, что оператор компилируется нормально? У вас есть строка success = sqlite3_prepare_v2(...);, но вы ничего не делаете, если success не SQLITE_OK. Вы убедились, что это SQLITE_OK?

С другой стороны, если бы вы использовали оболочку типа FMDB , вы могли бы заменить весь свой код выше на:

- (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];

    [database executeUpdate:@"insert into name(nid, name) values(?, ?)", [NSNumber numberWithInt:6], @"testname"];
    [database close];
}

Это, IMO, намного проще в отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...