2016-05-31 14 views
-1

res/raw /のcsvファイルをSQLiteデータベースに読み込もうとしています。ここに私の関数である。try/catchブロックの外でBufferReader変数を参照する方法

public void updateDatabase(Context context, SQLiteDatabase database) { 

    InputStream inputStream = context.getResources().openRawResource(R.raw.teamlist); 
    try { 
     BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 
    } catch (UnsupportedEncodingException ioe) { 
     Log.e("ERROR", "Could not load " + ioe); 
    } 

    String line = ""; 

    database.beginTransaction(); 
    try { 
     while ((line = buffer.readLine()) != null) { 
      // read each line from CSV file into a database 

     } 
    } catch (IOException ioe){ 
     Log.e("ERROR", "Could not load " + ioe); 
    } 
    database.setTransactionSuccessful(); 
    database.endTransaction(); 
} 

しかし、私は、whileループで「シンボル 『バッファ』を解決できません」エラーが発生します。 try関数の外部でBufferReaderを参照するにはどうすればよいですか?私は "null"を使用してtryブロックの外側にバッファーリーダーを初期化しようとしましたが、それはクラッシュする私のアプリを引き起こした。助言がありますか?

答えて

3

このようなコードは作成しないでください。それを書くために、より正しい方法は次のようになります。

要するに
public void updateDatabase(Context context, SQLiteDatabase database) { 

    try (InputStream inputStream = context.getResources().openRawResource(R.raw.teamlist); 
     BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));) { 

     String line; 
     database.beginTransaction(); 
     while ((line = buffer.readLine()) != null) { 
      // read each line from CSV file into a database 

     } 
     database.setTransactionSuccessful(); 
     database.endTransaction(); 
    } catch (IOException ioe){ 
     Log.e("ERROR", "Could not load " + ioe); 
    } catch (UnsupportedEncodingException ioe) { 
     Log.e("ERROR", "Could not load " + ioe); 
    } 
} 

、前tryブロック内にあるコードの成功に依存したコードは、そのtryブロックの内部でなければなりません。あなたのようにtry/catchの文章を書かないでください。

これはまた、入力ストリームのリソースリークを解決し、line変数を初期化する必要がないことに注意してください。

+0

意味があります。私はそれを変更して、それを撃つ。助けてくれてありがとう! – NBC

+0

それは働いて、助けてくれてありがとう! – NBC

関連する問題