나는 꽤 저주 받았고 약간의 의견을 부탁드립니다. csv 파일에서 데이터베이스에 삽입하는 응용 프로그램에 스레드가 있습니다. 모든 것이 잘된 것처럼 보이지만, 최근에 데이터베이스를 가져 오는 중 스택 트레이스가 개발자 콘솔에서 나에게 전송되었습니다.android sporadic database not open issue
내 사용자 중 아주 작은 부분에 100 개 중 1 개가이 문제가 있으며, 마침내 오류가 표시되기 전에 몇 시간 동안 삽입을 실행할 수 있으며, 내가 수행 한 것보다 차이가 없을 때 다른 80 번 괜찮 았을 때.
Heres는 스택 추적 :
코드java.lang.IllegalStateException : 데이터베이스가 android.database.sqlite에서 android.database.sqlite.SQLiteDatabase.insertWithOnConflict (SQLiteDatabase.java:1615) 에서 를 열 수 없습니다. 자바에서 com.ljworkshop.YugiohCompanion.home $ 8.run (home.java:1020) 에서 com.ljworkshop.YugiohCompanion.DBAdapterCards.insertCard (DBAdapterCards.java:169) 에서 SQLiteDatabase.insert (SQLiteDatabase.java:1515) .lang.Thread.run (Thread.java:1027)
을 Heres 섹션 :
당신이 스레드를 말할 때, 당신은 당신이 AsyncTask를를 사용하는 의미를 바랍니다public void cardBaseupdate(String file,int amount) {
final String files = file;
final int amountf = amount;
dialog = new ProgressDialog(home.this);
dialog.setCancelable(false);
dialog.setMessage("Populating Database");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(amountf);
dialog.show();
Thread background = new Thread (new Runnable() {
public void run() {
InputStream data1 = null;
try {
data1 = getAssets().open(files);
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader in = new BufferedReader(new InputStreamReader(data1));
String reader = "";
try {
while ((reader = in.readLine()) != null){
Integer.toString(in.readLine().length()),
String[] RowData = reader.split(",");
String name = RowData[0];
String number = RowData[1];
String series = RowData[2];
String type = RowData[3];
String element = RowData[4];
String level = RowData[5];
String spell = RowData[6];
String att = RowData[7];
String def= RowData[8];
String rules = RowData[9];
String legal = RowData[10];
dbc.open();
progressHandler.sendMessage(progressHandler.obtainMessage());
dbc.insertCard(name,number,series,type,element,level,spell,att,def,rules,legal);
dbc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
valueSet = true;
}
});
background.start();
안녕하세요, 답장을 보내 주셔서 감사 드리며 늦게 답장을 드려 죄송합니다. 결국 데이터베이스를 채우는 방법을 완전히 다시 확인했습니다. 당신은 스레드에서 csv를 통해 반복 루핑 말은 최고의 pratcice. 자산에 데이터베이스를 패키징하고 복사하는 것이 훨씬 더 효과적입니다. –