2016-05-31 84 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

相关问题