2011-04-18 130 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]; 

    }