2012-02-05 8 views
0

私はかなり困惑しています。私はcsvファイルからデータベースに挿入するスレッドをアプリケーションに持っています。すべてがうまく見えますが、最近、開発者用コンソールからデータベースにスタックトレースが届いていません。アンドロイド散在データベースが開かない

これは私のユーザーのほんの一部に過ぎず、おそらく100人に1人がこの問題を抱えています。私は何度もエラーを表示する前に挿入物を実行できます。それがうまくいけば他の80回。

HERESにスタックトレース:

java.lang.IllegalStateException:データベースはandroid.database.sqliteでandroid.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1615) で を開けません。 SQLiteDatabase.insert(SQLiteDatabase.java:1515) (com.ljworkshop.YugiohCompanion.DBAdapterCards.insertCard(DBAdapterCards.java:169) at com.ljworkshop.YugiohCompanion.home $ 8.run(home.java:1020) at 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

私はあなたがスレッドを言うとき、あなたはAsyncTaskを使っている意味を願っています。なぜなら、AsyncTaskはスレッドでアンドロイドに最適化されているからです。

理想的には、データベースロジックを実行しているときに、finally節を使用してEVERYTIMEデータベースを確実に閉じる必要があります。これにより、ロジック中に開かれるたびに閉じられることが保証されます。

また、スレッドはデータベーストランザクションを実行する安全な場所ではありません。通常、スレッド内でロジックを実行し、新しいデータを取得したらデータベースを更新します。

+0

こんにちは、ご感謝のご返信ありがとうございました。最後に、私はデータベースをどのように埋め込んだのかを完全に再現しました。あなたは、スレッドでcsvをループするとは言いませんが、最良の理由はありません。データベースを資産にパッケージングし、それをコピーします。これははるかに優れています。 –

関連する問題