2013-10-02 50 views
0

我有一個CSV文件位於我的資產文件夾。我需要我的程序來獲取CSV文件,然後將其數據插入到SQLite中的表中。讀取CSV然後插入數據到SQLITE

這裏是我當前的代碼

FileReader file; 
         file = new FileReader("com.xylol.o_cha/assets/questions/question_bank.csv"); 

         BufferedReader buffer = new BufferedReader(file); 

         String line = ""; 
         String tableName ="O_CHA_QUESTIONS"; 
         String columns = "QUESTION_ID, CATEGORY, ANIME TITLE, QUESTION_DESC, CHOICE1, CHOICE2, CHOICE3, CHOICE4, CORRECT_ANSWER, ANSWERED"; 
         String str1 = "INSERT INTO " + tableName + " (" + columns + ") values("; 
         String str2 = ");"; 

         database.beginTransaction(); 
         while ((line = buffer.readLine()) != null) { 
          StringBuilder sb = new StringBuilder(str1); 
          String[] str = line.split(","); 
          sb.append("'" + str[0] + "',"); 
          sb.append(str[1] + "',"); 
          sb.append(str[2] + "',"); 
          sb.append(str[3] + "'"); 
          sb.append(str[4] + "'"); 
          sb.append(str2); 
          database.execSQL(sb.toString()); 
         } 
         database.setTransactionSuccessful(); 
         database.endTransaction(); 

這裏的問題

09-23 05:47:29.436: W/System.err(7020): java.io.FileNotFoundException: /com.xylol.o_cha/assets/questions/question_bank.csv (No such file or directory) 
09-23 05:47:29.465: W/System.err(7020):  at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
09-23 05:47:29.465: W/System.err(7020):  at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:239) 
09-23 05:47:29.473: W/System.err(7020):  at java.io.FileInputStream.<init>(FileInputStream.java:88) 
09-23 05:47:29.473: W/System.err(7020):  at java.io.FileInputStream.<init>(FileInputStream.java:122) 
09-23 05:47:29.473: W/System.err(7020):  at java.io.FileReader.<init>(FileReader.java:66) 
09-23 05:47:29.483: W/System.err(7020):  at com.xylol.o_cha.Splash_Screen$1.run(Splash_Screen.java:73) 
09-23 05:47:29.483: W/System.err(7020):  at android.os.Handler.handleCallback(Handler.java:587) 
09-23 05:47:29.493: W/System.err(7020):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-23 05:47:29.493: W/System.err(7020):  at android.os.Looper.loop(Looper.java:132) 
09-23 05:47:29.493: W/System.err(7020):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
09-23 05:47:29.493: W/System.err(7020):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-23 05:47:29.493: W/System.err(7020):  at java.lang.reflect.Method.invoke(Method.java:491) 
09-23 05:47:29.493: W/System.err(7020):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
09-23 05:47:29.503: W/System.err(7020):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
09-23 05:47:29.526: W/System.err(7020):  at dalvik.system.NativeStart.main(Native Method) 
+0

您的問題究竟是什麼?我看到一些遺漏的代碼和一些可以做出的優化,但是如果沒有......一個問題就很難回答問題。 – elbuild

+0

查看我的答案,瞭解如何使用資產文件夾。 – Tugrul

回答

2

首先;你的代碼有什麼問題?您需要SQLiteHelper類和事務方法來創建柔性代碼設計。

一些建議;

  • 創建一個對象,用於將一行數據保存到csv中。按行(Ex: SimpleQuestion,提供給您輕鬆管理數據。)
  • 讀取文件行並分配給對象。將該對象添加到列表中。 (例如:List<SimpleQuestion>
  • 批量將列表插入到數據庫表中。

代碼:

private void readAndInsert() throws UnsupportedEncodingException { 


ArrayList<SimpleQuestion> questions = new ArrayList<SimpleQuestion>(); 
AssetManager assetManager = getAssets(); 
InputStream is = null; 

      try { 
       is = assetManager.open("questions/question_bank.csv"); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      BufferedReader reader = null; 
      reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 

      String line = ""; 
      StringTokenizer st = null; 
      try { 

       while ((line = reader.readLine()) != null) { 
        st = new StringTokenizer(line, ","); 
        SimpleQuestion sQuestion= new SimpleQuestion(); 
            //your attributes 
        sQuestion.setX(st.nextToken()); 
        sQuestion.setY(st.nextToken()); 
        sQuestion.setZ(st.nextToken()); 
        sQuestion.setW(st.nextToken()); 
        questions .add(sQuestion); 

       } 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 

      yourDB.bulkInsert(questions); 

} 
+0

對不起...我編輯的問題...請檢查在bulkInsert請再次 –

+0

幫助..什麼是它 –

+0

foreach循環INSERT語句,循環當代碼結束提交事務。 – Tugrul

0

讀者CSV,CSVReader是優於的FileReader使用。 找到最新的jar打開csv this link

如何從資產訪問文件?

CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("questions/question_bank.csv"))); 

嘗試這樣使用CSV閱讀器,所以你可以有字符串數組爲單獨的行

reader = new CSVReader(new FileReader(Environment.getExternalStorageDirectory()+"/folder/CSV/"+filename+".csv")); 
        try 
        { 
         List<String[]> myEntries = reader.readAll(); 
         Log.d("size","size of LIST Quote======>"+myEntries.size()); 
         if(myEntries.size()>0) 
         { 
          for(int i=0;i<myEntries.size();i++) 
          { 
           String arr[]=myEntries.get(i); 
           list11=new ArrayList<String>(); 
           for(int k=0;k<arr.length;k++) 
           { 
            list11.add(arr[k]); 
            //Log.d("log is", "data size is==>"+arr[k]); 
           } 
            dba.insetdata_New_Qoute(list11, "tblNewQute"); 
          } 
         } 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
+0

對不起...我編輯的問題...請檢查 –

相關問題