android sporadic数据库没有打开问题

时间:2012-02-05 21:13:36

标签: java android database

我有一个让我很难过的问题,并会感激一些意见。我的应用程序中有一个线程,它从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();

1 个答案:

答案 0 :(得分:1)

我希望当你说Thread时,你的意思是你正在使用AsyncTask。原因是因为AsyncTask在线程中针对android进行了优化。

理想情况下,当您运行数据库逻辑时,您希望确保使用finally子句关闭数据库EVERYTIME。这将确保在逻辑期间每次打开时它都会关闭。

线程也不是一个安全的地方进行数据库事务,通常你运行你的逻辑(在一个线程中),然后在你有新数据后更新数据库。