2012-02-05 2 views
0

나는 꽤 저주 받았고 약간의 의견을 부탁드립니다. 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(); 

답변

1

. 이유는 AsyncTask가 스레딩에서 안드로이드에 최적화 되었기 때문입니다.

이상적으로 데이터베이스 논리를 실행할 때 finally 절을 사용하여 데이터베이스를 항상 닫아야합니다. 이렇게하면 논리 중에 열릴 때마다 닫힙니다.

또한 스레드는 데이터베이스 트랜잭션을 수행하는 데 안전한 장소가 아니며, 일반적으로 스레드에서 논리를 실행 한 다음 새 데이터가 있으면 데이터베이스를 업데이트합니다.

+0

안녕하세요, 답장을 보내 주셔서 감사 드리며 늦게 답장을 드려 죄송합니다. 결국 데이터베이스를 채우는 방법을 완전히 다시 확인했습니다. 당신은 스레드에서 csv를 통해 반복 루핑 말은 최고의 pratcice. 자산에 데이터베이스를 패키징하고 복사하는 것이 훨씬 더 효과적입니다. –