将SQLite数据导出为CSV

时间:2015-10-20 07:59:05

标签: android sql excel sqlite android-sqlite

我的任务是将数据导出到CSV文件。我想在将数据导出到CSV文件之前生成查询。每个学生都有一个唯一的ID。至于现在,我能够分别在不同的表中导出数据并且运行良好。

这是我目前的架构:

1)学生表

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

2)会话表(每个学生可以有多个会话 - 未修复)

 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表格中的所有数据。会话表以及来自Interval表的相应间隔号和分数。我尝试过使用内部联接和不同类型的查询,但这些行中仍然存在一些重复的值。每个单元格只能包含一个值,因此在这种情况下,我将无法连接查询中的列。

这是我想要实现的目标:

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还是其他方法。任何帮助或建议将不胜感激。谢谢。

1 个答案:

答案 0 :(得分: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

但这只有在你事先知道有多少间隔时才有效