在sqlite中插入多个值

时间:2012-02-10 10:31:02

标签: 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'),
('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')

由于

3 个答案:

答案 0 :(得分:1)

这是可能的,但不是通常以逗号分隔的插入值。

试试这个......

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

是的,它有点丑陋,但很容易从一组值自动生成语句。此外,您似乎只需要在第一个选择中声明列名称。

答案 1 :(得分:0)

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

初始化数据库

-(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

答案 2 :(得分:-1)

对于您的上述查询,您必须创建数组并插入到sqlite。