2015-10-20 3 views
1

Моя задача - экспортировать данные в CSV-файл. Я пытаюсь создать запрос перед экспортом данных в файл CSV. У каждого ученика есть уникальный идентификатор. На данный момент я могу экспортировать данные в разные таблицы отдельно и хорошо работать.Экспорт данных SQLite в CSV

Вот моя текущая схема:

1) Студент Таблица

studID | name | teacher | activity 
SQ202  Mich  Lisa Hearing Test 
FG91A  Lim  Hanson Behavioural Test 

2) Session Table (Каждый студент может иметь более одной сессии - не фиксированная)

studID | startTime | endTime | sessionNo | status 
SQ202  10:00  10:40  1  Completed 
SQ202  13:00  13:50  2  Completed 
FG91A  14:20  15:00  1  Completed 

3) Таблица интервалов (каждый сеанс может иметь более четырех интервалов - не фиксирован)

studID |sessionNum |intervalNo | score 
SQ202  1   1  10/10 
SQ202  1   2  7/10 
       . 
       . 
       . 

Это, как я экспортировал данные из определенной таблицы:

File exportDir = new File(Environment.getExternalStorageDirectory(), ""); 
if (!exportDir.exists()) { 
    exportDir.mkdirs(); 
} 

file = new File(exportDir, “ChildObservation" + " (D)" + date + " (T)" + time +".csv"); 
try { 

    file.createNewFile(); 
    CSVWriter csvWrite = new CSVWriter(new FileWriter(file)); 


    // sqlite core query 
    SQLiteDatabase db = myNewGradingDB.getReadableDatabase(); 
    Cursor curChild = db.rawQuery("SELECT * FROM Student ORDER BY name", null); 
    csvWrite.writeNext(“Student ID”, “Name”, “Teacher”, “Activity"); 

    while (curChild.moveToNext()) { 

    String arrStr[] = { 
     curChild.getString(0), curChild.getString(1), 
     curChild.getString(2), curChild.getString(3), 
}; 
csvWrite.writeNext(arrStr); 
} 

csvWrite.writeNext(); 
csvWrite.close(); 
return true; 
} 

catch (IOException e) { 
    Log.e(“Child", e.getMessage(), e); 
    return false; 
}  

Однако моя цель состоит в том, чтобы получать и отображать все данные, привязанные к студенту в одной строке. Каждая строка в экспортированном листе Excel будет содержать все данные из таблицы Student & Таблица сеанса, а также от соответствующего номера интервала и оценок из таблицы интервалов. Я попытался использовать внутренние соединения и разные запросы, но в этих строках все еще есть дублированные значения. Каждая ячейка должна содержать только одно значение, поэтому в этом случае я не буду конкатенации столбцов в моем запросе.

Вот что я хочу добиться:

studID | name | teacher | activity  | startTime | endTime | sessionNo | status | intervalNo | score | intervalNo | score ... (repeat intervalNo and score) 
SQ202 Mich Lisa  Hearing Test  10:00  10:40  1   Completed  1   10/10  2  7/10 ... 
FG91A Lim  Hanson Behavioural Test 12:30  1:40  2   Completed  1   8/10  2  6/10 ...   

На данном этапе его невозможно для меня, чтобы изменить структуру базы данных. Возможно, есть и другие способы решить эту проблему, будь то SQL или другой. Любая помощь или предложения будут очень благодарны. Спасибо.

+0

Итак, каждая строка dest содержит Student + session + Interval1 + Interval2 + Interval3 + Interval4 data? – k3b

+0

@ k3b Да, это правильно. – CourageousLemon

+0

Глядя на это требование, я чувствую, что было бы лучше (с точки зрения производительности) делать форматирование в вашей программе, а не в SQLite. – PK20

ответ

0

если вы хотите SQL единственное решение, то трюк, чтобы решить вам проблему, чтобы присоединиться табличные интервал в несколько раз, используя псевдоним

select 
    st.studID, st.name, 
    se.startTime, 
    i1.intervalNo as intervalNo1, i1.score as score1, 
    i2.intervalNo as intervalNo2, i2.score as score2, 
    i3.intervalNo as intervalNo3, i3.score as score3, 
    i4.intervalNo as intervalNo4, i4.score as score4 

from Student as st 
    left join Session as se on st.studID = se.studID 
    left join Interval as i1 on st.studID = i1.studID and i1.sessionNo=1 
    left join Interval as i2 on st.studID = i2.studID and i2.sessionNo=2 
    left join Interval as i3 on st.studID = i3.studID and i3.sessionNo=3 
    left join Interval as i4 on st.studID = i4.studID and i4.sessionNo=4 

, но это работает только если вы заранее знаете, сколько interval- s есть

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