Получение строки из базы данных с помощью SQLite для iPhone

#iphone #sqlite

#iPhone #sqlite

Вопрос:

У меня есть этот код из руководства. Мне интересно, как изменить ее так, чтобы она считывала не double из базы данных, а просто строку.

 if(detailStmt == nil) {
    const char *sql = "Select price from Coffee Where CoffeeID = ?";
    if(sqlite3_prepare_v2(database, sql, -1, amp;detailStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating detail view statement. '%s'", sqlite3_errmsg(database));
}

sqlite3_bind_int(detailStmt, 1, coffeeID);

if(SQLITE_DONE != sqlite3_step(detailStmt)) {

    //Get the price in a temporary variable.
    NSDecimalNumber *priceDN = [[NSDecimalNumber alloc] initWithDouble:sqlite3_column_double(detailStmt, 0)];

    //Assign the price. The price value will be copied, since the property is declared with "copy" attribute.
    self.price = priceDN;

    //Release the temporary variable. Since we created it using alloc, we have own it.
    [priceDN release];
}
  

Я почти уверен, что строки, которые необходимо изменить, являются:

 sqlite3_bind_int(detailStmt, 1, coffeeID);
NSDecimalNumber *priceDN = [[NSDecimalNumber alloc] initWithDouble:sqlite3_column_double(detailStmt, 0)];
  

Мне нужно будет использовать sqlite3_bind_text и sqlite3_column_text, но я не уверен, как правильно изменить параметры.

Заранее благодарю вас за вашу помощь!

Ответ №1:

== Новый обновленный ответ ==

Я использую SQL Lite немного иначе, чем вы. Я никогда не использовал sqlite3_bind_text Мое предложение — заменить ваш сегмент кода на предоставленный мной сегмент кода. Я попытался сделать так, чтобы она охватывала весь ваш раздел кода. Возможно, потребуется пара настроек.

Приведенное ниже решение должно работать по всем направлениям с полями и строками. Вам нужно будет использовать только соответствующие sqlite3_column_text , sqlite3_column_double , sqlite3_column_int или другие типы, которые могут вам понадобиться внутри while(sqlite3_step(detailStmt) == SQLITE_ROW) цикла. Если вам нужна только первая строка, вы могли бы изменить цикл while на if (sqlite3_step(detailStmt) == SQLITE_ROW)

     if(detailStmt == nil) {
        const char *sql = "Select threadtxt from Coffee Where CoffeeID = ?";
    }    

    if (sqlite3_prepare_v2(database, sql, -1, amp;detailStmt, NULL) == SQLITE_OK)
    {
        // loop through the results and add them to the array
        while(sqlite3_step(detailStmt) == SQLITE_ROW) 
        {
            // read the data from the result row
            NSString *nameString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
            self.threadtxt = nameString;
        }   
    } else {
        NSAssert1(0, @"Error while getting the price of coffee. '%s'", sqlite3_errmsg(database));
    }

    // Release the compiled statement from memory
    sqlite3_finalize(detailStmt);
  

Комментарии:

1. Только что понял… Откуда берется compiledStatement?

2. Большое спасибо за ваше терпение, dredf! Итак, теперь я использую обновленную версию вашего кода. (За исключением того, что мне пришлось поместить все в первый оператор if, потому что в противном случае он не распознает sql в операторе prepare. Теперь загружается представление! Но у меня все еще есть проблема, поскольку она просто указывает null для строки, которую она должна была получить. Я ввел инструкцию NSLOG и увидел, что она даже не входит в цикл while. У вас есть еще какие-нибудь идеи по поводу того, что происходит не так? У меня действительно нет никакого опыта в этом, и я просто пытаюсь сделать это правильно для проекта.

3. Только что понял это! Большое спасибо за вашу помощь!