我有一个让我很难过的问题,并会感激一些意见。我的应用程序中有一个线程,它从csv文件插入到数据库中。一切似乎都很好,但最近我从开发人员控制台发送给我的数据库没有打开堆栈跟踪。
它对我的一小部分用户感到高兴,也许100个中有1个有这个问题,我可以在最终看到错误之前运行插入数小时,而当我做的时候我没有区别于我做了其他的80次,当它工作正常。
继承堆栈跟踪:
java.lang.IllegalStateException:数据库未打开 在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1615) 在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1515) 在com.ljworkshop.YugiohCompanion.DBAdapterCards.insertCard(DBAdapterCards.java:169) 在com.ljworkshop.YugiohCompanion.home $ 8.run(home.java:1020) 在java.lang.Thread.run(Thread.java:1027)
下面是代码部分:
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();
答案 0 :(得分:1)
我希望当你说Thread时,你的意思是你正在使用AsyncTask。原因是因为AsyncTask在线程中针对android进行了优化。
理想情况下,当您运行数据库逻辑时,您希望确保使用finally子句关闭数据库EVERYTIME。这将确保在逻辑期间每次打开时它都会关闭。
线程也不是一个安全的地方进行数据库事务,通常你运行你的逻辑(在一个线程中),然后在你有新数据后更新数据库。