我无法将值插入sqlite db

时间:2017-01-20 07:05:49

标签: ios objective-c xcode sqlite webview

我使用以下代码将代码插入数据库。数据由" :::"进行分割。并且正在拆分的这个值被添加到DB中。当我检查数据库时,数据未添加到SQLITE

#pragma mark - Web View Delegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *strResponse = [[request URL] absoluteString];
    if ([strResponse hasPrefix:@"ios:"]) {

        NSString *newString = [strResponse substringFromIndex:[@"ios:" length]];
        newString = [newString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        UIAlertView *uiAlert = [[UIAlertView alloc] initWithTitle:@"Message" message:newString delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
        [uiAlert show];

        NSArray *arrItems = [newString componentsSeparatedByString:@":::"];
        for (NSString *strItems in arrItems) {

            [strItems stringByRemovingPercentEncoding];
            NSMutableDictionary *mDic = [[NSMutableDictionary alloc] init];
            [mDic setObject:strItems forKey:@"item_name"];
            [mDic setObject:@"0" forKey:@"is_deleted"];
            [[DataBase connection] insertTableData:mDic AndTableName:@"school_feed"];
        }

        return NO;
    }
    return YES;
}

插入表数据方法

- (void)insertTableData:(NSMutableDictionary *)mDictDetails  AndTableName:(NSString*)table_name {
    NSArray *arrAllKey = [mDictDetails allKeys];

    NSString *key = @"";
    NSString *values = @"";

    for (NSInteger i = 0; i <arrAllKey.count ; i++) {

        NSString *column = arrAllKey[i];
        if ([key isEqualToString:@""]) {
            key = column;
            values =  @"?";
        } else {
            key = [key stringByAppendingString:[NSString stringWithFormat:@",%@", column]];
            values = [values stringByAppendingString:@", ?"];
        }
    }

    NSString *query = [NSString stringWithFormat: @"INSERT OR REPLACE INTO %@ (%@) values(%@)", table_name, key, values];
    const char *sql = [query UTF8String];

    sqlite3_stmt *insertStatement; // statement created

    if (sqlite3_prepare_v2(database, sql, -1, &insertStatement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }// if

    for (int i = 0; i <arrAllKey.count; i++) {
        NSString *column = arrAllKey[i];
        NSString *strKeys = [NSString stringWithFormat:@"%@", [mDictDetails objectForKey:column]];
        sqlite3_bind_text(insertStatement, i + 1, [strKeys UTF8String], -1, SQLITE_TRANSIENT);
    }

    sqlite3_step(insertStatement);// executing query
    sqlite3_finalize(insertStatement); // finalizing statement
}

1 个答案:

答案 0 :(得分:1)

试试这个:

static sqlite3 *database = nil;
static sqlite3 *contactDB;

创建数据库

- (void)viewDidLoad
{

        NSString *docsDir;
        NSArray *dirPaths;
        // Get the documents directory
        dirPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        docsDir = dirPaths[0];

        // Build the path to the database file
        databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"student.db"]];

        NSLog(@"Database Path: %@",databasePath);


        NSFileManager *filemgr = [NSFileManager defaultManager];
        if ([filemgr fileExistsAtPath: databasePath ] == NO)
        {
            const char *dbpath = [databasePath UTF8String];
            if (sqlite3_open(dbpath, &database) == SQLITE_OK)
            {
                char *errMsg;
                const char *sql_stmt ="create table if not exists studentsDetail (regno integer primary key, name text, department text, year text)";
                if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)
                    != SQLITE_OK)
                {
                    NSLog(@"Failed to create table");
                }
                sqlite3_close(database);
            }
            else {

                NSLog(@"Failed to open/create database");
            }
        }
        /*End Databse creation*/
}

保存数据:

- (IBAction)saveData:(id)sender
    {
        //regNoTextField,nameTextField,departmentTextField,yearTextField

        NSString *num= regNoTextField.text;
        int value = [num intValue];

        NSString *name= nameTextField.text;
        NSString *dep=departmentTextField.text;
        NSString *year=yearTextField.text;

      /*  NSLog(@"no   : %d",value);
        NSLog(@"name : %@",name);
        NSLog(@"depa : %@",dep);
        NSLog(@"year : %@",year);
        */

        sqlite3_stmt *statement = nil;
        const char *dbpath = [databasePath UTF8String];


        if (regNoTextField.text.length>0 &&nameTextField.text.length>0 &&
            departmentTextField.text.length>0 &&yearTextField.text.length>0 )
        {
            if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
            {
            NSString *insertSQL = [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values(\"%d\",\"%@\", \"%@\", \"%@\")",value,name, dep, year];


                const char *insert_stmt = [insertSQL UTF8String];
                sqlite3_prepare_v2(contactDB, insert_stmt,-1, &statement, NULL);

                if (sqlite3_step(statement) == SQLITE_DONE)
                {

                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Student Detail" message:@"Save Data" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

                    [alertView show];
                }
                else
                {
                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Student Detail" message:@"Unsuccessfull Save" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

                    [alertView show];
                }
                sqlite3_finalize(statement);
                sqlite3_close(contactDB);
            }
        }
        else
        {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Student Detail" message:@"Plese Entre Textfield Data" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

            [alertView show];

        }
    }