2011-04-18 145 views
3

我想插入數據到我的SQLite數據庫。我導入了所有爲我的項目而定的neccassry框架和數據庫文件。在我的控制器類xib中有兩個文本框和一個按鈕。當我點擊按鈕時,我希望將數據輸入保存在數據庫中的兩個文本字段中。從文本字段插入數據到SQLite數據庫

在我的應用程序delagate中,我創建了兩個函數,一個函數用於追加數據庫的路徑,另一個用於將數據插入數據庫。在插入功能中,我檢查某些條件,即如果添加了數據,應該顯示一個警告視圖,顯示添加的記錄,但是當我添加新記錄時,它總是進入else塊,這是一個錯誤。

-(void)checkAndCreateDB { 
    NSString* databaseName = @"login.sqlite"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *databasePath=[documentsDir stringByAppendingPathComponent:@"login.sqlite"]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    success = [fileManager fileExistsAtPath:databasePath]; 
    if(success) return; 
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 
} 

-(void)insertData{ 

    sqlite3 *database; 
    sqlite3_stmt *statement; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *databasePath=[documentsDir stringByAppendingPathComponent:@"login.sqlite"]; 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 

     NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO Loginchk (uname,password) VALUES ('%@',' %@');",Gunameq,Gpassq]; 
     const char *insert_stmt = [insertSQL UTF8String]; 
     if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK) 
     { 
      sqlite3_bind_text(statement, 1, [Gunameq UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 2, [Gpassq UTF8String], -1, NULL); 
     } 

     if(sqlite3_step(statement)==SQLITE_DONE) 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add Record" message:@"Contact Added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  
      [alert show]; 
      [alert release]; 
      alert=nil; 

     } 
     else 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"record" message:@"record not created" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
      alert=nil; 
     } 
     // Release the compiled statement from memory 
     sqlite3_finalize(statement);  
     sqlite3_close(database); 
    } 
} 

這是我的登錄控制器類。在這裏我已經聲明瞭一個函數,通過它我可以訪問我的應用程序委託函數。

-(IBAction)buttonPressed:(id)sender 
{ 

    Gpassq=Password.text; 
    Gunameq=Uname.text; 


    NSLog(@"%@%@",Gunameq,Gpassq); 
    AddListAppDelegate *appDelegate =(AddListAppDelegate *)[[UIApplication sharedApplication]delegate]; 
    [appDelegate insertData]; 

} 

請解決此問題。

+1

........可能的重複http://stackoverflow.com/questions/5699025/how-to-insert-data-in-sqlite-database/ 5699047#5699047 – Jhaliya 2011-04-18 08:48:22

+0

我關閉了你之前的問題,因爲這個包含更多的信息。但是,將來只需編輯您的問題以提供更多信息。 – 2011-04-21 06:16:28

回答

4
static sqlite3_stmt *insertStmt = nil; 

if(insertStmt == nil) 
{ 
    insertSql = "INSERT INTO Loginchk (uname,password) VALUES(?,?)"; 
    if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK) 
     NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database)); 
} 

sqlite3_bind_text(insertStmt, 1, [Gunameq UTF8String], -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(insertStmt, 2, [Gpassq UTF8String], -1, SQLITE_TRANSIENT); 
if(SQLITE_DONE != sqlite3_step(insertStmt)) 
    NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
else 
    NSLog("Inserted"); 
//Reset the add statement. 
sqlite3_reset(insertStmt); 
insertStmt = nil;   

在上面你可以看到。如果你綁定的數據不需要有stringWithFormat。只需加上問號而不是綁定文本。

希望它有幫助。

+0

嗨詹尼斯我試過這個,但它給了我錯誤,沒有這樣的表:Loginchk其實我有表名爲loginchk.What可能是問題 – Rani 2011-04-18 09:23:13

+0

嗨詹尼斯現在我的代碼工作正常,但我有一個問題,當我運行代碼它在alertview中向我顯示我的記錄正在增加,但是當我在瀏覽器中打開數據庫並查看錶格時,我的記錄未添加到我的表格中。爲什麼我的記錄被添加 – Rani 2011-04-18 10:01:49

+0

@Jennis:'if(insertStmt ==零)'測試目前沒有任何意義,因爲它總是如此。你的意思是宣佈它是「靜態」嗎? – JeremyP 2011-04-18 10:05:28

0

試試這個代碼:

-(void)addItem{ 

//for saving the data into database 

    if(addStmt == nil) { 
     const char *sql = "insert into employee(name, address) Values(?, ?)"; 
     if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
    } 

    sqlite3_bind_text(addStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 2, [address UTF8String], -1, SQLITE_TRANSIENT); 
    NSLog(@"%@",name); 
    NSLog(@"%@",address); 
    if(SQLITE_DONE != sqlite3_step(addStmt)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid 
     rowID = sqlite3_last_insert_rowid(database); 

    //Reset the add statement. 
    sqlite3_reset(addStmt); 
} 


+ (void) getInitialDataToDisplay:(NSString *)dbPath { 

//for retrieving data from database 

    InsertDataAppDelegate *appDelegate = (InsertDataAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

     const char *sql = "select name, address from employee"; 
     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); 

       //NSInteger primaryKey = sqlite3_column_int(selectstmt, 0); 
       Item *Obj = [[Item alloc]initWithPrimaryKey:primaryKey]; 
       Obj.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)]; 
       Obj.address=[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; 
       Obj.isDirty = NO; 
       [appDelegate.array addObject:Obj]; 
       [Obj release]; 
      } 
     } 
    } 
    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 
+0

什麼是addstmt? – Adeel 2015-03-25 11:48:57

0

另一個用於插入周圍的辦法是

// Create insert statement for the address 

NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO ADDRESS (STREETNAME, STREETNUMBER, PERSONID) VALUES (\"%@\", \"%@\", \"%d\")", person.address.streetName, person.address.streetNumber, personID]; 

if (sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK) 
    { 
     NSLog(@"Person inserted."); 
    } 
    else 
    { 
     NSLog(@"Error: %s", error); 
    } 
0
- (IBAction)sbumitbuttoncliked:(id)sender 
{ 

    sqlite3 *database; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"somefile1.sqlite"]; 

    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
    { 

     sqlite3_stmt *statment = nil; 

     NSString *queryString = [NSString stringWithFormat:@"Insert into form1 (name,password,phoneno)values(\'%@\',\'%@\',\'%@\')",textobj1.text, textobj2.text,textobj3.text]; 

     NSLog(@"%@",queryString); 
     const char *sql = [queryString UTF8String]; 
     sqlite3_prepare_v2(database, sql, -1, &statment, NULL); 

     if (textobj1.text.length==0||textobj2.text.length==0||textobj3.text.length==0) { 
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Success" message:@"Not Registered " delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil ]; 
      [alert show]; 
     } 

     else if (sqlite3_step(statment) == SQLITE_DONE) 
     { 
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Success" message:@"you have successfully registered" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil ]; 
      [alert show]; 
      [self dismissModalViewControllerAnimated:YES]; 

     } 

     sqlite3_finalize(statment); 
    } 
3

這個代碼可以運行

-(void) insert:key1:key2:key3 
    { 
     databaseName= @"db3.sqlite"; 
     NSArray *documentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
     NSString *documentsDir=[documentPaths objectAtIndex:0]; 
     databasePath=[documentsDir stringByAppendingPathComponent:databaseName]; 
     sqlite3 *database; 


     if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
      NSString *stmnt=[[[NSString alloc]initWithFormat:@"insert into login values(\"%@\",\"%@\",\"%@\")", key1,key2,key3] autorelease]; 
      const char *sqlStatement = [stmnt UTF8String]; 
      sqlite3_stmt *compiledStatement;  
      if (sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement,NULL) == SQLITE_OK) 
      { 
       if (SQLITE_DONE!=sqlite3_step(compiledStatement)) 
       { 
        UIAlertView *al=[[UIAlertView alloc] initWithTitle:@"INFO" 
                 message:@"Registration Fail" 
                 delegate:self 
                 cancelButtonTitle:@"ok" 
                  otherButtonTitles:nil]; 
        [al show]; 
        [al release]; 
       } 

       else { 
        UIAlertView *al=[[UIAlertView alloc] initWithTitle:@"INFO" 
                   message:@"Registerd" 
                   delegate:self 
                cancelButtonTitle:@"ok" 
                otherButtonTitles:nil]; 
        [al show]; 
        [al release]; 
       } 


      } 

      sqlite3_reset(compiledStatement); 
     } 
     sqlite3_close(database); 
    } 
    -(IBAction)clicked:(id)sender 
    { 

     NSString *t1=[[NSString alloc]initWithFormat:@"%@",txt1.text]; 

     NSString *t5=[[NSString alloc]initWithFormat:@"%@",txt2.text]; 

     NSString *t3=[[NSString alloc]initWithFormat:@"%@",txt3.text]; 

     //NSString *t2=[[NSString alloc]init]; 
     //NSInteger t3; 
     //NSString *t3=[[NSString alloc]init]; 

     //t1=txt1.text; 
     //t2=txt2.text; 
     //t3=txt3.text; 

     [self insert:t1:t5:t3]; 

    } 
相關問題