更快地插入sqlite3处理

时间:2018-08-29 11:52:47

标签: c# xamarin.forms sqlite

我具有此功能,它可以打开包含某些产品的.TXT文件,并在sqlitedb上逐行插入。该过程运行正常,问题就在这里。该文件包含2000多行,因此,该过程需要几个小时才能完成。我想知道是否有一种方法可以使过程更快一些。

这是函数:

   private void carrega_produtos()
    {
        var assembly = typeof(sincroniza_page).GetTypeInfo().Assembly;
        foreach (var res in assembly.GetManifestResourceNames())
        {
            if (res.Contains("produtos.txt"))
            {
                Stream stream = assembly.GetManifestResourceStream(res);
                var st = res.Count();
                using (var reader = new StreamReader(stream))
                {
                    string linha;
                    acesso_banco_produtos banco = new acesso_banco_produtos();
                    while ((linha = reader.ReadLine()) != null)
                    {
                        List<string> lista = linha.Split(new char[] { '§' }).ToList();
                        var cod = int.Parse(lista.ElementAt(0));
                        var nome_prod = lista.ElementAt(1);
                        var cod_grupo = lista.ElementAt(2);
                        var nm_grupo = lista.ElementAt(3);
                        var ind_ativo = lista.ElementAt(4);
                        var val_custo_unit = lista.ElementAt(5);
                        var val_custo = lista.ElementAt(6);
                        var perc_imposto = lista.ElementAt(7);
                        var unidade_med = lista.ElementAt(8);
                        var qtd_mes_1 = lista.ElementAt(9);
                        var qtd_mes_2 = lista.ElementAt(10);
                        var qtd_mes_3 = lista.ElementAt(11);
                        var qtd_mes_6 = lista.ElementAt(12);
                        var qtd_mes_12 = lista.ElementAt(13);
                        var data = lista.ElementAt(14);

                        var bd = new banco_produtos()
                        {
                            cod_produto = cod,
                            nm_produto = nome_prod,
                            cod_grupo = cod_grupo,
                            nm_grupo = nm_grupo,
                            ind_ativo = ind_ativo,
                            val_custo_unitario = Double.Parse(val_custo_unit),
                            val_lista_preco = val_custo,
                            perc_impostos = perc_imposto,
                            unidade_medida = unidade_med,
                            qtde_vendida_mes_1 = qtd_mes_1,
                            qtde_vendida_mes_2 = qtd_mes_2,
                            qtde_vendida_mes_3 = qtd_mes_3,
                            qtde_vendida_mes_6 = qtd_mes_6,
                            qtde_vendida_mes_12 = qtd_mes_12

                        };
                         //here i look in the DB if already exists the new product
                        var procura = banco.get_produto(cod);

                        if (procura == null)
                        {
                           // here is inserted to the db
                            banco.inserir_produto(bd);
                        }
                    }
                    valor += 1;
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

我不确定将数据插入db的方法内部是什么,但是SQLite和大量插入的最常见问题是SQLite默认情况下会用事务包装每个插入,这会产生大量开销。对于此类情况,一个好的做法是对所有插入进行交易,以显着提高性能,请参阅example

答案 1 :(得分:0)

我做了@Dmytro所说的,我使用了“ insertORIgnore”方法。使用该方法改进了很多。谢谢您的帮助。