Java android零星数据库未打开问题
我有一个问题让我很困惑,希望你能给我一些建议。我的应用程序中有一个从csv文件插入数据库的线程。一切似乎都很好,但最近我收到了从开发人员控制台发送给我的数据库非开放堆栈跟踪 这对我的一小部分用户来说是件幸事,也许每100个用户中就有一个有这个问题,我可以在最后看到错误之前运行insert几个小时,当我这样做的时候,与其他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) 运行(Thread.java:1027) 以下是代码的一部分:Java android零星数据库未打开问题,java,android,database,Java,Android,Database,我有一个问题让我很困惑,希望你能给我一些建议。我的应用程序中有一个从csv文件插入数据库的线程。一切似乎都很好,但最近我收到了从开发人员控制台发送给我的数据库非开放堆栈跟踪 这对我的一小部分用户来说是件幸事,也许每100个用户中就有一个有这个问题,我可以在最后看到错误之前运行insert几个小时,当我这样做的时候,与其他80次运行正常时没有什么不同 这里是堆栈跟踪: java.lang.IllegalStateException:数据库未打开 位于android.database.sqlite.
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();
我希望当你说线程时,你的意思是你在使用异步任务。这是因为AsyncTask在线程方面针对android进行了优化 理想情况下,在运行数据库逻辑时,您希望确保每次都使用finally子句关闭数据库。这将确保在逻辑期间每次打开时都将其关闭
另外,线程也不是执行数据库事务的安全场所,通常您运行逻辑(在线程中),然后在获得新数据后更新数据库。您好,谢谢您的评论,很抱歉回复太晚。。。最后,我完全重新完成了填充数据库的方式。正如您所说,在线程中循环通过csv并不是最好的做法。我正在将数据库打包到资产中,并将其复制过来,这样做会更好。