Ios 在循环中的Sqlite3中插入数据

Ios 在循环中的Sqlite3中插入数据,ios,objective-c,ios7,Ios,Objective C,Ios7,我是iOs编程新手。请帮忙 我正在创建一个数据库,若它不存在,那个么我将创建一个表,并在从文件中逐行读取记录之后,尝试将其插入数据库 我正在循环插入数据,我在互联网上读到了这段代码,我认为可能还剩下一些东西, 请提供帮助和指导,以获得此场景的最佳可能方式 是的,问题只与插入数据有关,创建数据库和带有模式的表工作正常 NSString*docsDir; NSArray*dirpath // Get the documents directory dirPaths = NSSearchPathFor

我是iOs编程新手。请帮忙

我正在创建一个数据库,若它不存在,那个么我将创建一个表,并在从文件中逐行读取记录之后,尝试将其插入数据库 我正在循环插入数据,我在互联网上读到了这段代码,我认为可能还剩下一些东西, 请提供帮助和指导,以获得此场景的最佳可能方式 是的,问题只与插入数据有关,创建数据库和带有模式的表工作正常

NSString*docsDir; NSArray*dirpath

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(
                                               NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = dirPaths[0];

// Buil d the path to the database file
_databasePath = [[NSString alloc]
                 initWithString: [docsDir stringByAppendingPathComponent:
                                  @"testing.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: _databasePath ] == NO)
{
    const char *dbpath = [_databasePath UTF8String];

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt =
        "CREATE TABLE IF NOT EXISTS testt (ID INTEGER PRIMARY KEY AUTOINCREMENT, Quotes VarChar, Author TEXT)";

        if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {

            _status.text = @"Failed to create table";
        }
        else
        {

            if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
            {
                 sqlite3_stmt    *statement;

                // customCode
                _filePathXml = [[NSBundle mainBundle] pathForResource:@"quotes_tod" ofType:@"txt"];
                NSString * contentsQ = [NSString stringWithContentsOfFile:_filePathXml encoding:NSASCIIStringEncoding error:nil];



                NSArray * lines = [contentsQ componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
                //  NSString * firstLine = [lines firstObject];

                NSInteger countLines = lines.count;
                NSInteger newCheck = 0;


                while (newCheck < countLines) {


                   NSString *insertSQL = [NSString stringWithFormat:
                                           @"INSERT INTO testt (Quotes ,Author) VALUES ( \"%@\" , \"Default\")",
                                           lines[newCheck]];

                     const char *insert_stmt = [insertSQL UTF8String];
                    sqlite3_prepare_v2(_contactDB, insert_stmt,
                                       1, &statement, NULL);
                    newCheck = newCheck +1;
                 //   NSLog( @"%@" ,lines[newCheck]);
            //        newCheck = newCheck + 1;
                }

          //      sqlite3_finalize(statement);
                 sqlite3_exec(_contactDB, "COMMIT", 0, 0, 0);
                sqlite3_close(_contactDB);



          }
}
}

在循环中,您似乎没有执行您创建的insert语句

改变这个

sqlite3_prepare_v2(_contactDB, insert_stmt,
                                   1, &statement, NULL);
对此

int returnCode = sqlite3_prepare_v2(_contactDB, insert_stmt, -1, &statement, nil);

if (returnCode == SQLITE_OK) {
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        NSLog(@"SQL ERROR");
    }
} else {
    NSLog(@"Error %d in statement \"%@\"",returnCode, insertSQL);
}
sqlite3_finalize(stmt);

您还应该检查prepare语句是否工作

我忘了添加它,现在它正在运行

  while (newCheck < countLines) {

                       if( lines[newCheck] != SingleChar)
                       {
                       NSString *insertSQL = [NSString stringWithFormat:
                                               @"INSERT INTO testt (Quotes ,Author) VALUES ( \"%@\" , \"%@\")",
                                               lines[newCheck] , [NSString stringWithFormat: @"test"]];

                         const char *insert_stmt = [insertSQL UTF8String];
                        sqlite3_prepare_v2(_contactDB, insert_stmt,
                                           -1, &statement, NULL);
                        if (sqlite3_step(statement) != SQLITE_DONE) {
                            SuccessComp = 1;
                        }
                      sqlite3_finalize(statement);
                       }
                        newCheck = newCheck +1;

                     //   NSLog( @"%@" ,lines[newCheck]);
                //        newCheck = newCheck + 1;
                    }

您好@flexicoder我刚刚更新了对我有效的答案,这是正确的方法吗?根据我的答案,您仍然应该通过查看返回代码来检查初始sqlite3\u prepare\u v2是否有效