#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. Только что понял это! Большое спасибо за вашу помощь!