2010-07-05 2 views
0

Essayer de savoir si un enregistrement existe dans SQLite sur l'iPhone, sauf que je reçois toujours une 'erreur inconnue'.'erreur inconnue' dans SQLite sur l'iPhone lors de la sélection du nombre total d'enregistrements

selectStmt est static sqlite3_stmt *selectStmt = nil; utilisé ici if(selectStmt) sqlite3_finalize(selectStmt); qui est seulement exécuté si l'application se termine. Cette fonctionnalité fonctionne bien avec les instructions de suppression et d'insertion d'instructions, donc je suppose que c'est quelque chose de mal avec la logique ci-dessous?

- (BOOL) doesBookExist { 

    if(selectStmt == nil) { 
     const char *sql = "select count(*) from books where isbn = ?"; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating select statement. '%s'", sqlite3_errmsg(database)); 
    } 

    //When binding parameters, index starts from 1 and not zero. 
    int count = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT); 

    if (SQLITE_DONE != sqlite3_step(selectStmt)) 
     NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database)); 

    sqlite3_reset(selectStmt); 

    return (count > 0); 
} 

Répondre

2

sqlite3_bind_text renvoie un code succès/erreur, et non le résultat d'une requête. Et l'étape doit renvoyer SQLITE_ROW, puisque vous avez une ligne de données de résultat (indépendamment du fait que le nombre est 0 ou plus). Il semblait y avoir une erreur, car vous attendiez SQLITE_DONE lorsque la valeur correcte était SQLITE_ROW. Ensuite, pour obtenir le compte, vous devez utiliser sqlite3_column_int après l'exécution de l'étape. Donc, quelque chose comme:

int bind_res = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT); 

if (SQLITE_OK != bind_res) 
{ 
    // log error, return... 
} 

// One row of result data, so step should return SQLITE_ROW 
if (SQLITE_ROW != sqlite3_step(selectStmt)) 
{ 
    NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database)); 
    // log error, return 
} 

int count = sqlite3_column_int(selectStmt, 0); 
+0

Cela prend tout son sens et fonctionne exactement comme je le voulais. Je vous remercie. – fuzz

+0

qu'est-ce que 'isbn'? – Sridhar

+0

@Sridhar, http://en.wikipedia.org/wiki/ISBN. Mais c'est aussi un nom de colonne et une variable dans ce code. –

Questions connexes