Ios 在sqlite中插入多个值

Ios 在sqlite中插入多个值,ios,iphone,cocoa-touch,sqlite,Ios,Iphone,Cocoa Touch,Sqlite,我正在开发iphone应用程序,在这个应用程序中,我必须在表中插入多个值。 我正在使用以下代码,但得到语法错误。我的语法哪里错了 INSERT INTO `ark1` (`A`, `B`, `C`) VALUES ('IKE', 'BEFÄLHAVARE OCH MILITÄRER', ' USA'), ('LEE', 'BEFÄLHAVARE OCH MILITÄRER', ' USA'), ('NEY', 'BEFÄLHAVARE OCH MILITÄRER', ' FRAN'), ('AL

我正在开发iphone应用程序,在这个应用程序中,我必须在表中插入多个值。 我正在使用以下代码,但得到语法错误。我的语法哪里错了

INSERT INTO `ark1` (`A`, `B`, `C`) VALUES
('IKE', 'BEFÄLHAVARE OCH MILITÄRER', ' USA'),
('LEE', 'BEFÄLHAVARE OCH MILITÄRER', ' USA'),
('NEY', 'BEFÄLHAVARE OCH MILITÄRER', ' FRAN'),
('ALBA', 'BEFÄLHAVARE OCH MILITÄRER', ' SPAN'),
('FOCH', 'BEFÄLHAVARE OCH MILITÄRER', ' FRAN'),
('GIAP', 'BEFÄLHAVARE OCH MILITÄRER', ' VIET'),
('HAIG', 'BEFÄLHAVARE OCH MILITÄRER', ' USA')

感谢您的上述查询,您必须创建数组并插入sqlite。

以下代码用于将数据插入数据库

数据库的初始化

-(id)init{
    if(self=[super init]) {
        documentsDirectory_Statement;
        documentsDirectory=[documentsDirectory stringByAppendingPathComponent:@"yourApplication.sqlite"];
        self.dbPath=documentsDirectory;
        NSFileManager *fm=[NSFileManager defaultManager];
        if(![fm fileExistsAtPath:self.dbPath]) {
            NSString *localDB=[[NSBundle mainBundle] pathForResource:@"yourApplication" ofType:@"sqlite"];
            NSError *err;
            if(![fm copyItemAtPath:localDB toPath:self.dbPath error:&err]){
                NSLog(@"Error in creating DB -> %@",err);
            }
        }

        if(sqlite3_open([self.dbPath UTF8String], &database) !=SQLITE_OK){
            NSLog(@"error while opening database.");
        } else {
            sqlite3_close(database);
        }
    }
    return self;
}
常数数

#define PUT_Value(_TO_,_FROM_) { \
NSString *str=[dObj valueForKey:_FROM_]; \
if(!str) str=@" "; \
sqlite3_bind_text(compiledStmt,_TO_,[str UTF8String],-1,SQLITE_TRANSIENT); \
}

#define PUT_Blob(_TO_,_FROM_) { \
    sqlite3_bind_blob(compiledStmt,_TO_,[[dObj valueForKey:_FROM_] bytes],[[dObj valueForKey:_FROM_] length],NULL);\
}

#define PUT_Integer(_TO_,_FROM_) { \
    NSInteger numbr=[[dObj valueForKey:_FROM_] intValue]; \
    sqlite3_bind_int(compiledStmt,_TO_,numbr); \
}


#define PUT_Double(_TO_,_FROM_) { \
CGFloat doubleX=[[dObj valueForKey:_FROM_] floatValue]; \
sqlite3_bind_double(compiledStmt,_TO_,doubleX); \
}


#define PUT_Date(_TO_,_FROM_) { \
sqlite3_bind_text(compiledStmt,_TO_, [[[dObj valueForKey:_FROM_] description] UTF8String], -1, SQLITE_TRANSIENT);\
}


#define GET_Value(_TO_,_FROM_) NSString *_TO_; { \
const unsigned char *c=sqlite3_column_text(compiledStmt,_FROM_); \
_TO_= c ? [NSString stringWithUTF8String:(char*)c] : @"" ; \
}

#define GET_Double(_TO_,_FROM_) double _TO_;{ \
_TO_=sqlite3_column_double(compiledStmt,_FROM_); \
}

#define GET_Integer(_TO_,_FROM_) NSUInteger _TO_; { \
_TO_ = sqlite3_column_int(compiledStmt,_FROM_); \
}

#define GET_Date(_TO_,_FROM_) { \
_TO_=sqlite3_column_double(compiledStmt, _FROM_)];\
}

#define GET_Blob(_TO_,_FROM_) { \
_TO_=sqlite3_column_blob(compiledStmt, _FROM_) length:sqlite3_column_bytes(compiledStmt, _FROM_)];\
}
插入函数

-(void)insertItem:(NSArray*)arItem{

    sqlite3_stmt *compiledStmt;
    if(sqlite3_open([self.dbPath UTF8String], &database) ==SQLITE_OK) {


        sqlite3_prepare_v2(database, "BEGIN TRANSACTION", -1, &compiledStmt, NULL);
        sqlite3_step(compiledStmt);
        sqlite3_finalize(compiledStmt);

        const char *sqlInsertQry="insert into alarm (id,years,months,days,hours,minutes,seconds,body) values(?,?,?,?,?,?,?,?)";
        if(sqlite3_prepare_v2(database, sqlInsertQry, -1, &compiledStmt, NULL) == SQLITE_OK ){
            for (NSDictionary *dObj in arItem) {
                PUT_Integer(1,@"id");
                PUT_Integer(2,@"years");
                PUT_Integer(3,@"months");
                PUT_Integer(4,@"days");
                PUT_Integer(5,@"hours");
                PUT_Integer(6,@"minutes");   
                PUT_Integer(7,@"seconds");                
                PUT_Value(8,@"body");                


                NSUInteger err = sqlite3_step(compiledStmt);
                if (err != SQLITE_DONE){
                    NSLog(@"error while binding %d %s",err, sqlite3_errmsg(database));
                }
                sqlite3_reset(compiledStmt);
            }
            sqlite3_finalize(compiledStmt);     
        } else {
            NSLog(@"Invalid Query");
        }
        sqlite3_prepare_v2(database, "END TRANSACTION", -1, &compiledStmt, NULL);
        sqlite3_step(compiledStmt);
        sqlite3_finalize(compiledStmt); 
        sqlite3_close(database);
    } else {
        NSLog(@"error while opening database.");
    }
}
希望这段代码有助于实现数据库连接


@Samuel

这是可能的,但不适用于通常的逗号分隔的插入值

试试这个

insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

是的,这有点难看,但很容易从一组值自动生成语句。此外,您似乎只需要在第一个select中声明列名。

但我必须通过在sqlite数据库中手动执行查询来插入数据,而不是通过您用于添加查询的浏览器进行编程sqlite官方版本目前还不支持多值插入。但是开发分支已经升级为具有此功能。(此评论是为了今年晚些时候或2013年阅读此stackoverflow页面的所有人)