Использование stringWithFormat для настройки запроса

Не совсем уверен, почему это не работает.

sqlite3 *db;
sqlite3_open([databasePath UTF8String], &db);
NSString *query;

NSNumber *start = (*cur_page * 50) - 50;

query = [NSString stringWithFormat:@"SELECT rest_db.rest_id, rest_db.name, prices.value FROM rest_db JOIN prices ON rest_db.rest_id = prices.table_id WHERE prices.table_name = 'rest_db'  ORDER BY rest_db.name ASC %d Limit 50;", start];

Ранее код выглядел так:

sqlite3 *db;
sqlite3_open([databasePath UTF8String], &db);
NSString *query;

query = @"SELECT rest_db.rest_id, rest_db.name, prices.value FROM rest_db JOIN prices ON rest_db.rest_id = prices.table_id WHERE prices.table_name = 'rest_db'  ORDER BY rest_db.name ASC";

который работал просто отлично. Я попытался установить запуск как:

int start
int *start
NSString *start

и, конечно же, я изменил "%d" соответственно для строки. Все безрезультатно. Я в неведении на данный момент. Программа вылетает, когда я попадаю на эту страницу сейчас. Ошибок нет, ничего не могу написать с помощью NSLog.

Я также пытался использовать:

[NSString alloc] initWithFormat

Есть идеи? Их ценят. Спасибо.

----------------------------- РЕДАКТИРОВАТЬ -------------------- --------

.h

int page_count;
int cur_page;

@property int page_count;
@property int cur_page;


.m

@synthesize page_count;
@synthesize cur_page;

int start = (cur_page * 50) - 50;

query = [NSString stringWithFormat:@"SELECT rest_db.rest_id, rest_db.name, prices.value FROM rest_db JOIN prices ON rest_db.rest_id = prices.table_id WHERE prices.table_name = 'rest_db'  ORDER BY rest_db.name ASC %d Limit 50;", start];

И теперь, поскольку я исправил приведение типов благодаря одному из предыдущих предложений, это не приводит к сбою программы, но не показывает данные из запроса как start = 0. Что, когда я просматриваю свой код, именно то, что должно равняться , и если бы мой оператор sqlite был настроен правильно, я бы увидел, что я помещаю его в ограничение не в том месте... -.- Таким образом, первоначальной проблемой приведения типов был сбой и, похоже, единственная проблема.


person James    schedule 05.10.2011    source источник
comment
Также обратите внимание, что ваш синтаксис SQLite неверен — начальное значение должно быть указано как limit x, 50, или как предел 50 смещения x.   -  person Hot Licks    schedule 05.10.2011
comment
Правильно, это то, что я упомянул, когда писал это редактирование. ;)   -  person James    schedule 05.10.2011


Ответы (2)


Я подозреваю, что NSNumber *start = (*cur_page * 50) - 50; вычисляет целочисленное значение, а затем присваивает это значение int указателю start, создавая недопустимый указатель. start следует объявлять как int или NSInteger.

person Hot Licks    schedule 05.10.2011
comment
Спасибо за комментарий, но я изначально пытался объявить его как int безрезультатно. Я также только что попробовал NSInteger с той же проблемой. - person James; 05.10.2011
comment
Возможно, это связано с тем, что cur_page (чью декларацию вы не раскрываете) является NSNumber. В этом случае вы должны сказать [cur_page intValue] вместо *cur_page. - person Hot Licks; 05.10.2011
comment
Объявление изменено, чтобы соответствовать тому, что я объявляю как начало. Поэтому, когда start был int, cur_page изначально был объявлен как int. То же самое, когда это был NSInteger или NSNumber. - person James; 05.10.2011
comment
Если бы все было объявлено как int (и без *), то это работало бы с %d. Но я предполагаю, что у вас практически нет опыта работы с кодом C, поэтому вы не совсем понимаете значение *. - person Hot Licks; 05.10.2011
comment
Опыт близок к 0, но я знаю, что * представляет собой указатель на объект, а не фактический объект, верно? Но я пробовал с * и без него, пытаясь это сделать. Через мгновение я опубликую свои текущие объявления и код в исходном посте. - person James; 05.10.2011
comment
Не было очевидной необходимости иметь дело с NSNumbers в коде, который вы нам показали, поэтому мне интересно, откуда вы вообще взяли эту идею. - person Hot Licks; 05.10.2011
comment
Потому что я пробовал несколько разных типов, чтобы посмотреть, что сработает. Но первоначальная проблема заключалась в том, что две переменные имели разные типы приведения, когда я впервые написал это. Cur_page был int, и по какой-то причине у меня было начало как NSNumber. Но когда я это исправил, у меня все еще была проблема. Думая, что это та же проблема, я продолжал искать идеи, пока не увидел ошибку в своем заявлении sqlite. - person James; 05.10.2011
comment
Пока вы не заставите его работать так, как вам нравится, NSLog все ваши исходные операторы SQLite, чтобы вы могли видеть, что вы генерируете. - person Hot Licks; 05.10.2011

Попробуйте использовать %@ вместо %d. %d для целых чисел; NSNumber является объектом target-c.

Также, вместо

NSNumber *start = (*cur_page * 50) - 50;

пытаться

NSNumber *start = [NSNumber numberWithInt:([cur_page intValue] * 50) - 50];

Предполагая, что cur_page имеет тип NSNumber*.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnumber_Class/Reference/Reference.html

person Jacob Jennings    schedule 05.10.2011
comment
Или, лучше, измените start на int или NSInteger (без *). Или, если он настаивает на использовании NSNumber, код [start intValue] (хотя я скептически отношусь к тому, чтобы это присвоение start давало правильный результат). - person Hot Licks; 05.10.2011
comment
Спасибо за комментарий, но это приводит к той же проблеме. Хотя мой cur_page изначально был типа int, я соответствующим образом изменил его для этих испытаний. Я также пробовал NSInteger безрезультатно. - person James; 05.10.2011
comment
Покажите нам объявление для cur_page и то, как вы устанавливаете его значение. - person Hot Licks; 05.10.2011