2013-11-27 3 views
0

Я новичок и работаю над кодом ниже. В результате создания файла NSMutableDictionary из файла CSV я передаю значение классу DatabaseManager, и есть метод, который получает значения и пытается вставить его в базу данных. 1. Как я могу вставить эти значения в БД? 2. Является ли эффективным способом сделать небольшое приложение для словарей на iOS? (У меня есть прибл 40000 записей и размер составляет около 3 МБ)iOS csv to sqlite

  1. ГЛАВНЫЙ КЛАСС

    ... 
    
    NSString *filePath= [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"csv"]; 
    NSString *content = [[NSString alloc]initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 
    
    //NSString *path1=[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"JapMon" ofType:@"csv"] encoding:NSUTF8StringEncoding error:nil]; 
    NSArray *messArr=[content componentsSeparatedByString:@"\n"]; 
    
    if(messArr) 
    { 
        NSLog(@"%d", [messArr count]); 
        for(int i=1;i<=[messArr count]-2;i++) 
        { 
         NSMutableDictionary *d=[[NSMutableDictionary alloc] init]; 
         NSString *StrValue=[NSString stringWithFormat:@"%@",[messArr objectAtIndex:i]]; 
         StrValue=[StrValue stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 
         StrValue=[StrValue stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
         // Here give whatever saperator you need to saperate data 
         NSArray *arr=[StrValue componentsSeparatedByString:@","]; 
         //NSLog(@"%@", [arr objectAtIndex:2]); 
    
    
         [d setValue:[arr objectAtIndex:0] forKey:@"word"]; 
         [d setValue:[arr objectAtIndex:1] forKey:@"hansa"]; 
         [d setValue:[arr objectAtIndex:2] forKey:@"def"]; 
    
         //Here add logic to insert row in your database table 
         [[DatabaseManager getSharedInstance]insertInitialDataToDb:d]; 
         //NSLog(@"%@", d); 
         //Add this dictionary "d" into database 
         [d release]; //Cleanup. 
        } 
    } 
    //[content release]; 
    ... 
    

2.DATABASEMANAGER КЛАСС

-(BOOL) insertInitialDataToDb:(NSMutableDictionary*)initialData 
    { 
     const char *dbpath = [databasePath UTF8String]; 
     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      NSString *insertSQL = [NSString stringWithFormat:@"insert into japmon (word, hansa, def) values (\"%@\")", initialData]; 
      NSLog(@"ok"); 
      const char *insert_stmt = [insertSQL UTF8String]; 
      sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL); 
      if (sqlite3_step(statement) == SQLITE_DONE) 
      { 
       return TRUE; 

      } 
       else { 
       return FALSE; 
      } 
      sqlite3_reset(statement); 
     } 
     return TRUE; 
+0

Моя база данных использует полнотекстовый поиск – Johny

+0

Это что-то вам нужно делать регулярно или только один раз при первом запуске? Являются ли эти данные довольно статичными, скорее всего, лучше импортировать CSV в файл базы данных SQLite заблаговременно и включить файл DB, а не делать все это в коде. – Devunwired

+0

Почему вы не используете Core Data? – HAS

ответ

0

Из вашего запроса вы хотели бы вставить значения до трех столбцов. Но вы передаете только словарь.

NSString *insertSQL = [NSString stringWithFormat:@"insert into japmon (word, hansa, def) values (\"%@\")", initialData]; 

вы должны изменить вас stringWithFormat с этим

NSString *insertSQL = [NSString stringWithFormat:@"insert into japmon (word, hansa, def) values (\"%@\",\"%@\",\"%@\"), WORD_COL_VALUE,HANSA_COL_VALUE,DEF_COM_VALUE]; 
0

Наконец я решил мой вопрос самостоятельно. Лучшим способом была подготовлена ​​база данных FTS sqlite, не импортирующая после создания базы данных «основные данные». В результате производительность автозаполнения/предложения для моего приложения составляет не более 3,2 МБ использования процессора более 50 000 записей в формате UTF-8 на симуляторе, таком как скорость ветра.