【问题标题】:inserting data into SQLite DB Table将数据插入 SQLite DB 表
【发布时间】:2012-07-05 21:30:36
【问题描述】:

在我的应用程序中,我使用 SQLite 数据库来存储数据。 这是我用来插入数据的示例代码

在我的主类中调用这些方法如下

-(IBAction)insertButtonAction:(id)sender
{
BOOL isRollNum;
Database *db = [[Database alloc]init];
if ([rollNumberTxtFld.text length]>0)
{
    isRollNum = [db checkForRollNumber:rollNumberTxtFld.text];
    if (isRollNum == YES) 
    {
        UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Student with specified roll number already available" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [errorAlert show];
    }
    else
    {
        if ([nameTxtFld.text length]>0 && [rollNumberTxtFld.text length]>0  ) 
        {
            NSString *name = nameTxtFld.text;
            NSString *num = rollNumberTxtFld.text;
            int age = [ageTxtFld.text intValue];
            NSString *address1 = address1TxtFld.text;
            NSString *address2 = address2TxtFld.text;
            NSString *mobile = mobileTxtFld.text;
            NSString *class =classTxtFld.text;

            NSLog(@"%@ %@ %d %@ %@ %@ %@ ",name,num,age,address1,address2,mobile,class);

            NSString* insert_stmt = NULL;
            insert_stmt = [NSString stringWithFormat:@"insert into friends(name,rollnumber,age,address1,address2,mobile,class) values('%@', '%@', '%d', '%@', '%@', '%@', '%@')",name,num,age,address1,address2,mobile,class,nil ];  
            Database *db = [[Database alloc]init];
            BOOL inserted = [db insertIntoDB:insert_stmt];
            if (inserted == YES) 
            {
                insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Inserted" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [insertReenterAlert show];
            }
            else
            {
                insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Failed" message:@"Not Inserted" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [insertReenterAlert show];
            }
        }
        else
        {
            insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@" Please enter required fields and try again." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [insertReenterAlert show];
        }
    }
}
else
{
    insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@" Please enter required fields and try again." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [insertReenterAlert show];
}
}

此方法用于检查我们要插入的卷号是否已存在于数据库表中。

-(BOOL)checkForRollNumber:(NSString *) num
{
rollNumberArray = [[NSMutableArray alloc] init];
NSFileManager *fileManager = [NSFileManager defaultManager];
dbPath = [[NSBundle mainBundle]pathForResource:@"FriendsList"ofType:@"sqlite"];
NSLog(@"dbPath %@",dbPath);    
BOOL success = [fileManager fileExistsAtPath:dbPath];
int rowCount = 0;
if (success)
{
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    {
        const char* sqlStatement = "SELECT COUNT(rollnumber) FROM friends ";
        sqlite3_stmt* statement;
        if( sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK ) 
        {
            if( sqlite3_step(statement) == SQLITE_ROW )
            rowCount  = sqlite3_column_int(statement, 0); 
        }
        else
        {
            NSLog( @"Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(database) );
        }
        sqlite3_finalize(statement);
        sqlite3_close(database);
    }
}
NSLog(@"rowCount %d",rowCount);
if (success)
{
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        const char *selectSQL = "SELECT rollnumber FROM friends"; 
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, selectSQL, -1, &statement, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_ROW)
            {
                for ( int i=0; i<rowCount; i++ )
                {
                    NSLog(@"i    %d",i);
                    NSString *str = [NSString stringWithUTF8String:(char *) sqlite3_column_text(statement, 0)];
                    [rollNumberArray addObject:str];
                    NSLog(@"rollNumberArray: %@",[rollNumberArray objectAtIndex:i]);
                }
            }
            for ( int i=0; i<[rollNumberArray count]; i++ )
            {
                NSLog(@"[rollNumberArray objectAtIndex:%d] %@ == num %@",i,[rollNumberArray objectAtIndex:i],num);
                if ([[rollNumberArray objectAtIndex:i] intValue] == [num intValue])
                {
                     NSLog(@"FOUND");
                    return YES;
                }
                else
                {
                    NSLog(@"NOT FOUND");
                    return NO;
                }
            }
        }
        else
        {
            NSLog(@"Statement Not Prepared");
            return NO;
        }
        sqlite3_finalize(statement);
    }
    else
    {
        NSLog(@"Database Not Opened");
        return NO;
    }
    sqlite3_close(database);
}
else
{
    NSLog(@"File Not Opened");
    return NO;
}
}

这是向表中插入数据的方法

-(BOOL) insertIntoDB :(NSString *) insert_stmt 
{
NSFileManager *fileManager = [NSFileManager defaultManager];
dbPath = [[NSBundle mainBundle]pathForResource:@"FriendsList"ofType:@"sqlite"];
NSLog(@"dbPath %@",dbPath);    
BOOL success = [fileManager fileExistsAtPath:dbPath];
if (success)
{
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        const char *insertSQL = [insert_stmt UTF8String]; 
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, insertSQL, -1, &statement, NULL) == SQLITE_OK) //**Always not entering into this if**
        {
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                NSLog(@"Succesfully added in DB");
                return YES;
            }
            else
            {
                 NSLog(@"Not added in DB");
                return NO;
            }
        }
        else
        {
            NSLog(@"Statement Not Prepared");
            return NO;
        }
        sqlite3_finalize(statement);
    }
    else
    {
        NSLog(@"Database Not Opened");
        return NO;
    }
    sqlite3_close(database);
}
else
{
    NSLog(@"File Not Opened");
    return NO;
}
}

不满足这个条件sqlite3_prepare_v2(database, selectSQL, -1, &statement, NULL) == SQLITE_OK) 而且只有第一次的价值在增加。 任何人都可以帮助或建议我。

提前致谢。

【问题讨论】:

  • 检查您使用 NSLOG 显示的数据库路径是否正确?
  • 考虑使用CoreData?
  • 当您的准备失败时,sqlite3_errmsg(database) 会报告什么?

标签: iphone ios


【解决方案1】:

sqlite3_prepare_v2 将返回您忽略的错误代码。为什么不将它分配给一个变量,以便您可以在使用 if 语句对其进行测试之前对其进行检查?

int returnCode = sqlite3_prepare_v2(database, insertSQL, -1, &statement, NULL) 
if (returnCode == SQLITE_OK) // put a breakpoint here and look at return code.

【讨论】:

  • 但是它返回了什么?该错误代码应该告诉您准备失败的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2012-02-07
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多