SQLite3在iOS应用程序中没有更新

时间:2013-11-26 11:38:48

标签: ios objective-c sqlite

我有一个名为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。我认为这会奏效。

2 个答案:

答案 0 :(得分:0)

确保指向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;
            }
        } 

    } 

答案 1 :(得分:0)

发现问题。更新语句中没有单引号?8。好吧,它总是小问题。谢谢大家!