Проблемы с запросом на обновление IOS sqlite - PullRequest
2 голосов
/ 30 декабря 2011

Я очень плохо знаком с программированием на 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);
}

Ответы [ 2 ]

1 голос
/ 16 апреля 2013

Я обновил код и получил результат = 0 для sqlite3_bind_text.Означает ли это, что он был обновлен без ошибок или вообще не было обновлено ни одной записи?Не уверен, что еще нужно сделать в этот момент ...

   BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bh.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];

    NSLog(writableDBPath);

    if(success)
    {
        const char *dbPath= [writableDBPath UTF8String];

        //[G msgBox:writableDBPath title:@""];

        //const char *dbpath = [databasePath UTF8String];
        sqlite3_stmt *statement;
        sqlite3 *contactDB = NULL;

        if (sqlite3_open(dbPath, &contactDB) == SQLITE_OK)
        {

            NSString *updateSQL = @"UPDATE account SET name = ? ";
            const char *update_stmt = [updateSQL UTF8String];


            int e = sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, nil);
            if(e != SQLITE_OK) {
                NSLog(@"Problem with updateEntryWithUniqueID");
                NSLog(@"Error Code: %d, message '%s'", e, sqlite3_errmsg(contactDB));

                return;
            }else{
                NSLog(@"Updated");
                [G setNickname:thisNickname];
            }

            int result=sqlite3_bind_text(statement, 1, [thisNickname UTF8String], -1, SQLITE_TRANSIENT);
            NSLog(@"bind result= %i", result);


            if(sqlite3_step(statement) != SQLITE_DONE) {
                NSLog(@"Problems updating");
            }

            /* Finished */ 
            sqlite3_finalize(statement);
        }else
        {
            NSLog(@"Can not open DB.");
        }

    }else{
        NSLog(@"path not exsist");        }
0 голосов
/ 05 января 2012

Исходя из моего понимания, похоже, что структура NSArray при загрузке данных может отличаться, так как вы используете NSIndexPath.

Я рекомендую следующий подход с использованием объекта Singleton.

Объект Singleton работает как контейнер, который используется несколькими контроллерами или классами представления.

Возвращаясь к вашей проблеме, вы можете сохранить объект (singleEvent) в Singleton длядругой uitableview, чтобы поднять его.

Это предполагает, что ваш объект singleEvent имеет ключевые поля, такие как Id.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...