2012-02-05 2 views
0

У меня проблема, которая сильно меня озадачила, и я бы по достоинству оценил некоторый вклад. У меня есть поток в моем приложении, который вставляется в базу данных из файла csv. Все кажется прекрасным, но в последнее время я получаю базу данных, не открывая трассировки стека, отправленные мне с консоли разработчика.андроид спорадическая база данных не открыта проблема

Его счастье на самом деле небольшая часть моих пользователей, возможно, 1 из 100 имеет эту проблему, я могу запустить вставку в течение нескольких часов, прежде чем я, наконец, увижу ошибку, и когда я сделаю это, нет никакой разницы, чем то, что я сделал другой 80 раз, когда он работал нормально.

Heres трассировка стеки:

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)

Heres участок кода:

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

Я надеюсь, что когда вы говорите тему, вы имеете в виду вы используете AsyncTask. Причина этого в том, что AsyncTask оптимизирован для андроида в потоковом режиме.

В идеале, когда вы используете логику базы данных, вы хотите, чтобы вы закрыли свою базу данных EVERYTIME, используя предложение finally. Это гарантирует, что он будет закрыт каждый раз, когда он будет открыт во время вашей логики.

Также поток не является безопасным местом для транзакций с базой данных, как правило, вы запускаете свою логику (в потоке), а затем обновляете базу данных, когда у вас есть новые данные.

+0

Привет, спасибо за комментарий и извините за поздний ответ ... В конце концов я полностью повторил, как я заполнил базу данных. Как вы говорите, прохождение csv в потоке не является лучшим pratcice. Im упаковывает базу данных в активы и копирует ее, что работает намного лучше. –

Смежные вопросы