簡體   English   中英

iOS sqlite更新查詢問題

[英]IOS sqlite update query issues

我對IOS編程非常陌生,因此我不確定如何最好地解決此問題。

我有一個正在顯示在表視圖中的事件的數據庫,當您選擇這些項之一時,它會顯示詳細信息以及將其保存為“收藏夾”的選項,該選項只會更新數據庫中的一列並將其設置為1 。

我有第二個表視圖,用於查找將其“收藏夾”設置為1的所有實例。

我遇到的問題是,我只想出了如何使“ updateItem”數據庫查詢在所選項目的路徑之外起作用。 由於每個表視圖在不同的路徑上顯示相同的項目,因此當您使用“收藏夾”表視圖時,“ updateItem”查詢將更新數據庫中的錯誤項目。

我了解在UpdateItemAtID方法中,它使用aryDatabase,而收藏夾查詢使用aryDatabaseFav。 我不得不創建第二個數組來解決收藏夾表視圖的問題,也許有一種更好的方法可以僅使用原始aryDatabase數組來擁有我想要的一切,而不是擁有2個不同的數組。

這是我為兩個選擇語句以及更新查詢提供的代碼,是否有更好的方法可以繞過項目的路徑?

-(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);
}

我已經更新了代碼,並在sqlite3_bind_text上獲得了一個result = 0。 是否意味着它已被更新為沒有錯誤或根本沒有記錄被更新? 不知道此時該怎么辦...

   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");        }

根據我的理解,由於您使用的是NSIndexPath,因此NSArray加載數據時的結構方式似乎有所不同。

我確實建議使用單例對象的以下方法。

Singleton Object的工作方式就像一個容器,在少數視圖控制器或類之間共享。

回到您的問題,您可以將對象(singleEvent)存儲在Singleton中,以供其他uitableview使用。

假設您的singleEvent對象具有鍵字段(例如Id)。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM