2014-02-03 3 views
1

У меня проблемы с образцовой программой, которую я пишу.Android Вставить в базу данных sqlite из .csv

Вот мой код:

public void prePopulateDatabase(SQLiteDatabase db, Context helperContext){ 
    String fileIn = ""; 
    String[] file; 
    ContentValues row = new ContentValues(); 
    AssetManager am; 
    InputStream is = null; 
    am = helperContext.getResources().getAssets(); 

    try { 
     is = am.open("Matrix.csv"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     while((fileIn = br.readLine()) != null){ 
      file = fileIn.split(","); 
      row.put(KEYWORD, file[0]); 
      row.put(DURATION, file[1]); 
      row.put(AMOUNT, file[2]); 
      row.put(DESCRIPTION, file[3]); 
      row.put(LEVEL_NAME, file[4]); 
      row.put(CHOICE_FOR_TWO_1, file[5]); 
      row.put(CHOICE_FOR_TWO_2, file[6]); 
      row.put(CHOICE_FOR_FIVE_1, file[7]); 
      row.put(CHOICE_FOR_FIVE_2, file[8]); 
      row.put(CHOICE_FOR_FIVE_3, file[9]); 
      row.put(CHOICE_FOR_FIVE_4, file[10]); 
      row.put(CHOICE_FOR_FIVE_5, file[11]); 
      insertToDBViaContentValues(db, row); 
     }//end while 
    } catch (Exception e) { 
      e.printStackTrace(); 
    }//end try catch 
}//end fxn 

public void insertToDBViaContentValues(SQLiteDatabase db, ContentValues row){ 
    procedure("SiteMatrixMultiLevels: INSERT TO DB > "+row.toString()); 
     db.insert(TABLE_SITES, null, row); 
} 

public void validate(SQLiteDatabase db){ 
    Cursor c = db.rawQuery("select * from "+TABLE_SITES, null); 
    if(c != null && c.moveToFirst()){ 
     while(!c.isAfterLast()){ 
      data("VALUE: " + c.getString(0) + "," + c.getString(1) + "," + c.getString(2) + "," + c.getString(3) + "," + c.getString(4) + "," + c.getString(5) 
        + "," + c.getString(6) + "," + c.getString(7) + "," + c.getString(8) + "," + c.getString(9) + "," + c.getString(10) 
        + "," + c.getString(11) + "," + c.getString(12)); 
      c.moveToNext(); 
     } 
    } 
} 

, и я получаю ошибку

02-03 20:24:04.537: W/System.err(16437): java.lang.ArrayIndexOutOfBoundsException: length=7; index=7 

на

row.put(CHOICE_FOR_FIVE_1, file[7]); 

CSV-файл, который я забирающий файлы имеет несколько строк но только следует 2 форматам. Первый 100 имеют такой формат

pkey,keyword,duration,amount,description,A,B,,,,, 

, а другой 100 следовать этому формату

pkey,keyword,duration,amount,description,,,C,D,E,F,G 

Я не уверен, если им получить ошибку, потому что первый тип формата останавливается только на 7 (так как никакой ценности для C, D, E, F, G).

Любая помощь будет оценена по достоинству. Благодаря!

+0

no value добавить "" (пусто) –

+0

привет Дхаваль благодарит за ваш ответ. Вы предполагаете, что если длина равна 0, я вручную добавляю? Я получаю все свои данные из csv, используя row.put, и насколько это возможно, я хочу сохранить его таким образом. Без использования операторов if, чтобы определить, не имеет ли значение столбца из csv. – momoja

+0

@ user1481694 Правило большого пальца - проверить, существует ли индекс перед его индексированием. – James

ответ

1

Нет никаких проблем с данными. Вот то, что вам нужно для вашей split() вызова ...

file = fileIn.split(",", -1); 

Вот и все ...

На самом деле вам нужно обратиться к документации по split(String regex), как он говорит,

Этот метод работает как бы путем вызова метода разделения с двумя аргументами с данным выражением и предельным аргументом нуля. Таким образом, в результирующем массиве не включаются строки .

Значит, вам нужно определить второй аргумент (лимит) в нем, иначе он будет считать его zero '0' и пустые записи будут удалены. Итак пройти -1, чтобы получить все пустые записи.

Надеюсь, что это поможет ...

+0

@laalto хорошо пункт друг. –

+0

спасибо за этот ответ. – momoja

0

Простая реализация. Попробуйте использовать StringTokenizer.

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

привет, спасибо за этот ответ. однако, я чувствую, что использование split over st - это путь, так как я бы больше не хотел удлинять код. :) – momoja

+0

Спасибо, тоже. Хорошо продолжайте;) – Tugrul

Смежные вопросы