вставка кратных значений в sqlite - PullRequest
0 голосов
/ 10 февраля 2012

Я работаю над приложением для 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 ]

1 голос
/ 10 февраля 2012

Это возможно, но не с обычными значениями вставки, разделенными запятыми.

Попробуйте это ...

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

Да, это немного некрасиво, но достаточно легко автоматизировать генерациюутверждения из набора значений.Кроме того, кажется, что вам нужно только объявить имена столбцов при первом выборе.

0 голосов
/ 10 февраля 2012

Следующий код используется для вставки данных в базу данных

инициализация базы данных

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

0 голосов
/ 10 февраля 2012

Для вышеприведенного запроса вы должны создать массив и вставить его в sqlite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...