有点背景故事:所以我有两个.txt
文件的数据。大约有816行,每行168个字符(166 +新行),这给我们提供了大约13.5MB的数据。现在我必须阅读这两个文件并将数据添加到我的数据库中。我有类DatabaseHelper
(它扩展了SqliteOpenHelper
,我在那里工作数据库)和类Podatek
,Skladisce
和Lokacija
(以帮助我存储所有数据很好)。所以主要问题是,如何加速从文件读取和写入数据库?我尝试了一些我发现的东西,但它只加速了整个过程0.2秒(平均而言,我的Nexus 5x需要10秒)。加快从文件读取和写入数据库
更新:从文件读取约需要300 ms
所以这不能真的快得多,所有子字符串函数获取约。 2s
,以及几乎所有的时间7s
都需要插入到数据库中。
其中I读写代码:在substring()
try{
FileInputStream fis=null;
fis = new FileInputStream(file_skladisca);
Charset inputCharset = Charset.forName("windows-1250");
InputStreamReader isr = new InputStreamReader(fis, inputCharset);
BufferedReader br = new BufferedReader(isr);
String line;
fis.getChannel().position(0);
FileInputStream fis2=null;
fis2 = new FileInputStream(file_lokacije);
Charset inputCharset2 = Charset.forName("windows-1250");
InputStreamReader isr2 = new InputStreamReader(fis2, inputCharset2);
BufferedReader br2 = new BufferedReader(isr2);
String line2;
fis2.getChannel().position(0);
FileInputStream fis3=null;
fis3 = new FileInputStream(file_podatki);
Charset inputCharset3 = Charset.forName("windows-1250");
InputStreamReader isr3 = new InputStreamReader(fis3, inputCharset3);
BufferedReader br3 = new BufferedReader(isr3);
String line3;
fis2.getChannel().position(0);
SQLiteDatabase dbf = db.getWritableDatabase();
dbf.beginTransaction();
while((line = br.readLine()) != null){
Skladisce skl = new Skladisce();
skl.setIDSkladisca(line.substring(0, idSkl).trim());
skl.setimeSkladisca(line.substring(idSkl, idSklIme).trim());
skl.setVodenjeLokacij(line.substring(idSklIme, idSklImeVodenje).trim());
db.createSkladisce(skl);
}
while((line2 = br2.readLine()) != null){
Lokacija lok = new Lokacija();
lok.setID_skladisca(line2.substring(0, idSkl).trim());
lok.setID_lokacije(line2.substring(idSkl, idSklLok).trim());
db.createLokacija(lok);
}
while((line3 = br3.readLine()) != null){
Podatek pod = new Podatek();
pod.setIDSkladisca(line3.substring(0, idSkl).trim());
pod.setSifraPodatka(line3.substring(idSkl, idSklPod).trim());
pod.setCrtnaKoda(line3.substring(idSklPod, idSklPodCrtna).trim());
pod.setImePodatka(line3.substring(idSklPodCrtna, idSklPodCrtnaImePod).trim());
pod.setEnotaMere(line3.substring(idSklPodCrtnaImePod, idSklPodCrtnaImePodEM).trim());
pod.setKnjiznaKolicina(line3.substring(idSklPodCrtnaImePodEM, idSklPodCrtnaImePodEMKK).trim());
pod.setNacinVodenjaSerSt(line3.substring(idSklPodCrtnaImePodEMKK, idSklPodCrtnaImePodEMKKNVS).trim());
db.createPodatek(pod);
}
dbf.setTransactionSuccessful();
dbf.endTransaction();
dbf.close();
fis3.close();
fis2.close();
fis.close();
}
catch (IOException e) {alert_single("Napaka!", "IO Napaka", "Nadaljuj");
e.printStackTrace();
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);}
catch (Exception e) {//alert_single("Napaka!", "Verjetno ste vpisali napačno dolžino polj v datoteki.", "Nadaljuj");
e.printStackTrace();
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);}
值只是预定int
值,其中从文件I“分裂”的数据(各数据具有以行一定量的字符)。
+需要几分钟没有dbf.beginTransaction()
,所以如果您不知道它,这是一件好事。
所以我期待着能够加快整个过程的一个答案,或者只是一个建议如何以不同的方式做得更好(通过不改变整个结构)。
在此先感谢!
移动设备上的闪存存储速度很慢。为什么你会发布.txt文件而不是完成的数据库? –
因为我没有:)我从其他人那里得到这些文件,然后我与他们一起操作......并且他们可以只运送文件而不是数据库,据我所知,但我会尝试在该方向做些事情,谢谢提出建议。 – varuhan
+我完全忘记了......我无法发送数据库,因为在我的设置中,我提供用户更改每列的长度(这样他可以准确地指定它为他自己的数据)...所以我有完全从头开始构建数据库... – varuhan