0

我的资产文件夹中有一个 CSV 文件。我需要我的程序来获取 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)
4

2 回答 2

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 );

}
于 2013-10-02T06:43:43.280 回答
0

要阅读 csv,CSVReader 比 FileReader 更好用。找到打开 csv 的最新 jar这个链接

如何从资产访问文件?

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();
                    }
于 2013-10-02T06:43:19.300 回答