有點背景故事:所以我有兩個.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