2012-10-18 78 views
0

我有SQLite數據庫,我有一個名爲tblUser的表,其中我有變量說Id,名稱,圖像,性別。sqlite3表主鍵被取代

在我的應用程序中,我給功能添加,刪除更新用戶條目(通用功能)。假設我在2個用戶的頁面上默認有2條記錄,並且兩條記錄都被刪除。現在插入第三記錄將被提供的主鍵3.

現在如果我編輯特定的記錄則未更新,而相同的主鍵的新的數據與1更換當我打電話下面的函數:

+ (void) getInitialDataToDisplay:(NSString *)dbPath 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    //sqlite3_open([dbPath UTF8String], &database); 
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     const char *sql = "select UserId,UserAge,UserName,UserGender,UserImage from [tblUser]"; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
     { 
      while(sqlite3_step(selectstmt) == SQLITE_ROW) 
      { 
       NSInteger primaryKey = sqlite3_column_int(selectstmt,0); 
       UserDetail *DataObj = [[UserDetail alloc] initWithPrimaryKey:primaryKey]; 

       DataObj.UserAge = sqlite3_column_int(selectstmt,1); 
       DataObj.UserName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]; 
       DataObj.UserGender = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)]; 
       DataObj.UserImage = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)]; 
       DataObj.isDirty = NO; 
       [appDelegate.DataArray addObject:DataObj]; 
      } 
     } 
     else 
     { 
      NSAssert1(0,@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database)); 
     } 
    } 
    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 

注意,當我回來的地方點擊保存,所有的細節需要填充頁面的按鈕後顯示在用戶的列表頁面,我調用此函數。任何提示都將非常有幫助。謝謝。

+0

SQLite不會改變你的主鍵,所以在其他地方有一個bug。我建議向我們展示編輯記錄的SQL。 – Rob

+1

另外,對於CL的觀點,你如何確定插入記錄的'UserId'?如果你依靠SQLite爲你做這件事,確保你使用'INTEGER PRIMARY KEY AUTOINCREMENT'而不僅僅是'INTEGER PRIMARY KEY'。您可能想向我們展示您的SQL以插入新記錄。你說它被插入爲3,當你編輯時,它變成了1,但我們都懷疑問題可能在插入而不是編輯。 – Rob

回答

1

假設UserId是一個INTEGER PRIMARY KEY: 的SQLite將創建新的ID作爲一個大高於先前最大的價值, 但如果表是空的,它會(re)start at 1

+0

但它允許我創建一次所有的記錄被刪除,只有當我編輯記錄時出現問題..!還要注意,主鍵是一個從1開始的整數。 – Sarah

+1

然後,請顯示您在哪裏執行'UPDATE'的代碼。 –

+1

如果你的代碼使用'INTEGER PRIMARY KEY AUTOINCREMENT',SQLite將在1不會重新啓動,即使表被刪除。如果重新創建表,它會重新啓動。但是,如果您只是刪除行並重新開始插入,則不行。 – Rob