簡體   English   中英

SQLite3未在iOS應用程序中更新

[英]SQLite3 not updating in iOS application

我有一個名為Budgets的表,該表存儲其設置,值和充滿對象購買的購買nsarray。

我不確定我在這里的方法中做錯了什么,但是它不會更新現有條目上的數據庫。 這樣可以節省新的預算。

- (BOOL) saveBudget:(Budget *)budget
{
    BOOL success = false;
    sqlite3_stmt *statement = NULL;
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        if (budget.budgetID > 0) {
            NSLog(@"Existing data, Update Please");
            NSString *updateSQL = [NSString stringWithFormat:@"UPDATE BUDGETS set name = '%@', budget = '%@', customdate = '%d', customday = '%d', rolloverp = '%d', rollovern = '%d', purchases = ?8 WHERE id = ?", budget.name, budget.budget, budget.customDate, budget.customDay, budget.rolloverP, budget.rolloverN];
            const char *update_stmt = [updateSQL UTF8String];
            sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL);
            sqlite3_bind_int(statement, 1, budget.budgetID);
            sqlite3_bind_blob(statement, 8, [budget.purchases bytes], [budget.purchases length], SQLITE_TRANSIENT);
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                success = true;
            }
        }
        else
        {
            NSLog(@"New data, Insert Please");
            NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO BUDGETS (name, budget, customdate, customday, rolloverp, rollovern, purchases) VALUES (\"%@\", \"%@\", \"%d\", \"%d\", \"%d\", \"%d\", ?8)", budget.name, budget.budget, budget.customDate, budget.customDay, budget.rolloverP, budget.rolloverN];
            const char *insert_stmt = [insertSQL UTF8String];
            sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL);
            sqlite3_bind_blob(statement, 8, [budget.purchases bytes], [budget.purchases length], SQLITE_TRANSIENT);
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                success = true;
            }
        }

        sqlite3_finalize(statement);
        sqlite3_close(database);
        NSLog(@"Save Success");
    }
    return success;
}

我假設查詢不正確,但是我可能是錯的。

編輯:這是我添加數據庫的方式。 同樣,可以添加新條目並從數據庫中檢索新條目。 檢索舊條目,但不會更新。

- (void) initDatabase
{
    NSString *docsDir;
    NSArray *dirPaths;

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];

    databasePath = [[NSString alloc] initWithString:
                    [docsDir stringByAppendingPathComponent:@"budget.db"]];

    NSFileManager *filemgr = [NSFileManager defaultManager];

    if([filemgr fileExistsAtPath:databasePath] == NO)
    {
        const char *dbpath = [databasePath UTF8String];
        if (sqlite3_open(dbpath, &database) == SQLITE_OK)
        {
            NSString sql_stmt = @"CREATE TABLE IF NOT EXISTS BUDGETS (";
            sql_stmt = [sql_stmt stringByAppendingString:@"id INTEGER PRIMARY KEY AUTOINCREMENT, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"name TEXT, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"budget DOUBLE, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"customdate INTEGER, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"customday INTEGER, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"rolloverp INTEGER, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"rollovern INTEGER, "];
            sql_stmt = [sql_stmt stringByAppendingString:@"purchases BLOB)"];

            if (sqlite3_exec(database, [sql_stmt UTF8String], NULL, NULL, &errMsg) != SQLITE_OK)
            {
                NSLog(@"Failed to create table BUDGETS");
            }
            else
            {
                NSLog(@"BUDGETS table created successfully");
            }
            sqlite3_close(database);
        }
        else
        {
            NSLog(@"Failed to open/create database");
        }
    }
}

另一個問題:關於是否正確保存購買的NSArray,我還有一個問題。 我以為這行得通。

確保指向SQlite數據庫的位置正確。在執行查詢之前,請確保表處於打開狀態並准備好進行操作。 請參考以下代碼:

        sqlite3_stmt    *statement;
        sqlite3 *cPDB;
        NSString *docsDir;
        NSArray *dirPaths;

        dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        docsDir = [dirPaths objectAtIndex:0];
         // Data base path 
        databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"cPDB.db"]];

     const char *dbpath = [databasePath UTF8String];

if (sqlite3_open(dbpath, &cPDB) == SQLITE_OK)
    {

        NSString *querySQL = [NSString stringWithFormat: @"UPDATE USER_SESSION_INFO SET \"%@\" = \"%@\", synState = 'false' WHERE sessionName=\"%@\"",categoryTy,state,sessionName];


        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(cPDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            if((sqlite3_step(statement)) != SQLITE_DONE)
                NSLog(@"Not Updated");
            else
            {
                NSLog(@"Succesfully updated row !");
                return YES;
            }
        } 

    } 

找到了問題。 在更新語句中,?8附近沒有單引號。 好吧,這總是小問題。 感謝大家!

暫無
暫無

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

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