Я очень плохо знаком с программированием на IOS, поэтому не совсем уверен, как можно решить эту проблему лучше всего.
У меня есть база данных событий, которые отображаются в табличном представлении, когда вы выбираете один из этих элементов, он показывает детали вместе с возможностью сохранить его как «избранное», который просто обновляет столбец в БД и устанавливает это к 1.
У меня есть второе табличное представление, которое ищет все экземпляры, для которых их "избранное" установлено в 1.
Проблема, с которой я столкнулся, заключается в том, что я только понял, как заставить запрос базы данных "updateItem" функционировать вне пути выбранного элемента. Поскольку в каждом табличном представлении один и тот же элемент отображается по разным путям, запрос «updateItem» обновляет неверный элемент в базе данных, когда вы используете табличное представление «избранное».
Я понимаю, что в методе UpdateItemAtID он использует aryDatabase, а запрос избранного использует aryDatabaseFav. Мне нужно было создать второй массив, чтобы обойти список избранных таблиц, возможно, есть лучший способ получить все, что я хочу, только с оригинальным массивом aryDatabase, а не с двумя разными массивами.
Вот код, который у меня есть для двух операторов выбора, а также для запроса на обновление, есть ли лучший способ обойти путь элемента?
-(void)readItems {
if (!database) return; // earlier problems
if (!selStmt)
{
const char *sql = "SELECT * FROM Events;";
if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
{
selStmt = nil;
}
}
if (!selStmt)
{
NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}
// loop reading items from list
[aryDatabase removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW)
{ // get the fields from the record set and assign to item
//bindings omitted
[aryDatabase addObject:se]; // add to list
[se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}
-(void)readFavItems {
if (!database) return; // earlier problems
if (!selStmt)
{
const char *sql = "SELECT * FROM Events WHERE mySchedule = 1;";
if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
{
selStmt = nil;
}
}
if (!selStmt)
{
NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}
// loop reading items from list
[aryDatabaseFav removeAllObjects]; // clear list for rebuild
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW)
{ // get the fields from the record set and assign to item
//bindings omitted
[aryDatabaseFav addObject:se]; // add to list
[se release]; // free item
}
sqlite3_reset(selStmt); // reset (unbind) statement
selStmt = nil;}
-(void)updateItemAtID:(NSIndexPath *)path {
singleEvent *i = (singleEvent *)[aryDatabase objectAtIndex:path.row];
int ret;
const char *sql = "UPDATE events SET mySchedule = ? WHERE _id = ?;";
if (!updStmt)
{ // build update statement
if ((ret=sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL))!=SQLITE_OK)
{
NSAssert1(0, @"Error building statement to update items [%s]", sqlite3_errmsg(database));
}
}
// bind values to statement
NSInteger m = i.intId;
sqlite3_bind_int(updStmt, 1, m);
NSInteger p = i.intPk;
sqlite3_bind_int(updStmt, 2, p);
if ((ret=sqlite3_step(updStmt)) != SQLITE_DONE)
{
NSAssert1(0, @"Error updating values [%s]", sqlite3_errmsg(database));
}
sqlite3_reset(updStmt);
}