是否可以将sqlite数据库的列名作为Android应用程序中用户的输入?

时间:2017-04-25 01:17:39

标签: android sqlite

我正在为我的大学院系创建一个Android应用程序,通过这个应用程序,他们将能够保持并保持学生参加他们的讲座。 我想过以这种方式设计数据库

日期|学生1 |学生2 | 。 。 。 。 。 。 |。 。 。|。 。 。 | Student60

在此结构中,每个INSERT INTO语句将采用61个值,一个用于日期,其余用于60个学生的在线/缺席记录。 但在这种情况下,列标题必须由用户命名(列标题应该是该特定学生的唯一标识符,如他的滚动号)。可能吗?还是我完全走错了路? 请建议是否有更好的数据库设计替代方案。 我还需要为用户提供检索学生总出勤率的能力。 如果我问过一些非常基本或愚蠢的事情,请提前道歉。

1 个答案:

答案 0 :(得分:4)

这是在错误的轨道上。相反,将学生的ID作为主键列,并使用其他列存储学生元数据,如下所示:

学生

ID | first_name | last_name |
1  | Jon        | Skeet     |
2  | Gordon     | Linoff    |
...

考勤

ID | SID | date       | status
1  | 1   | 2017-05-24 | absent
2  | 1   | 2017-05-25 | present
3  | 2   | 2017-05-24 | present
4  | 2   | 2017-05-25 | present

现在,如果您想了解某一天的哪些学生,您可以使用以下查询:

SELECT
    s.first_name,
    s.last_name
FROM Students s
INNER JOIN Attendance a
    ON s.ID = s.SID
WHERE a.status = 'present' AND
      a.date = '2017-05-24'

请注意,在练习中,您可以使用整数(0或1)来存储出勤率。

要回答您的实际问题,如果您想要学生的摘要以及他在最近90天内的出勤记录,您可以使用此:

SELECT SID, 100*(SUM(CASE WHEN status = 'present' THEN 1 ELSE 0 END) / 90) AS p_attedance
FROM Attendance
WHERE date > date('now', '-90 days');
GROUP BY SID