2013-11-26 25 views
0

我有一張名爲Budgets的表格,它存儲了其設置,值和購買完整對象購買的購買nsarray。SQLite3沒有在iOS應用程序中更新

我不知道我在做什麼我的方法錯了,但它不會更新現有條目上的數據庫。它可以節省一個新的預算。

- (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的正確與否節省了購買的問題。我認爲這會起作用。

+0

數據庫文件位於何處?它必須在文檔目錄中,因爲應用程序包ins只讀 – rckoenes

+0

您可以共享日誌輸出嗎?你確定你的數據庫存儲在一個可寫的位置嗎?如果您將其與應用程序捆綁在一起,它將是隻讀的,除非您將其複製到應用程序的主文件夾或其他可寫位置。 –

+0

通常情況下,此症狀是由於試圖從數據包中訪問數據庫,而將其複製到首先讀取/寫入存儲。 –

回答

0

發現問題。更新聲明中沒有單引號8。那麼,它總是小問題。感謝大家!

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

    } 
+0

我很確定我已經在這裏做了一切。我剛剛發佈了我目前正在檢查和添加數據庫的方式,它看起來一樣。 –

相關問題