Получение строки из базы данных с использованием SQLite для iPhone - PullRequest
1 голос
/ 02 мая 2011

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

if(detailStmt == nil) {
    const char *sql = "Select price from Coffee Where CoffeeID = ?";
    if(sqlite3_prepare_v2(database, sql, -1, &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 Ответ

2 голосов
/ 02 мая 2011

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

Я использую 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, &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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...