【问题标题】:How do I create this database?如何创建这个数据库?
【发布时间】:2020-03-29 22:29:49
【问题描述】:

我正在尝试开发一个英文应用程序,但我在数据库方面苦苦挣扎,显然我不擅长。

如果有人能给我一些启发,我将不胜感激。

就是这样:

第一个应用程序的想法很简单,该应用程序包含在学生注册中,输入一个代码,自动将他移动到某个房间,与其他人的英语水平相匹配,房间当然有教授,水平使用特定的本书有很多章节,并根据章节进行练习。

我的问题是如何建立一个数据库,其中房间里有一本书,里面有很多章节和很多练习......

不知道这是否清楚......对不起,我疯了!

感谢您的宝贵时间!!!

【问题讨论】:

  • 您好,如果您的图书内容为 Pdf 格式,那么您可以将其存储在本地存储中。但是如果你想存储在数据库中,那么这里有一个链接github.com/Geet-Thakur01/android_Room_Demo

标签: android database sqlite database-connection flow


【解决方案1】:

第一步是设计数据库,首先要识别数据集,然后将这些数据集转换为包含分组值列表的表。

所以你已经确定了房间、学生?、书籍、章节和练习以及教授。这些可能是表格的候选者。

一个表由具有相同列数的行组成。一列将保存相同类型的数据,例如房间名称。

Room 表,听起来可能几乎没有房间的编号或名称信息。为了使到目前为止提到的所有桌子的事情变得简单/有效,最好使用 id 实体在将房间与其他桌子相关联时轻松有效地识别房间。

所以您的 Room 表可以使用 SQL 创建,如下所示:-

CREATE TABLE IF NOT EXISTS room (_id INTEGER PRIMARY KEY, roomName TEXT UNIQUE);

学生和教授,因为他们都是人,可能会共享大部分相同的信息,然后两者都可能在同一个表中,也许 Poeple 与其他数据,如姓名电子邮件等,用于指示此人是学生、教授还是其他类型的人的列。您提到了级别(这可以用来区分教授,例如,如果英语的级别是 1-10,那么如果级别大于 10,那么它可以指示教授)。

所以你的 Person 表可能是这样的:-

CREATE TABLE IF NOT EXISTS person (_id INTEGER PRIMARY KEY, personName TEXT, personEmail TEXT, personTypeIndicator INTEGER);
  • 请注意,假设 personTypeIndicator 对于学生来说是 1-10,对于教授来说是 100。

书籍、章节和练习

CREATE TABLE IF NOT EXISTS book (_id INTEGER PRIMARY KEY, bookName TEXT, room_reference INTEGER NOT NULL REFERENCES room(_id) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE IF NOT EXISTS chapter (_id INTEGER PRIMARY KEY, chapterName TEXT, bookReference INTEGER NOT NULL REFERENCES book(_id) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE IF NOT EXISTS excercise (_id INTEGER PRIMARY KEY, excerciseName TEXT, chapter_reference INTEGER NOT NULL REFERENCES chapter(_id) ON DELETE CASCADE ON UPDATE CASCADE);

如您所见,这些表格有一些共同点。

  • _id已使用此名称,因为它对 Android 很有用。
  • INTEGER PRIMARY KEY 这不仅使列成为主键(必须是唯一的并且自动称为索引),而且在 SQLite 中它使列(每个表只有一个这样的列)成为rowid 列(最有效的索引),但也允许 SQLite 为表中的每一行分配一个唯一值(每个表)。
  • REFERENCES table(column) 这会创建一个 FOREIGN KEY,表示列中的值必须与父(引用)表(列)中的值匹配
    • 由于 SQLite 中的一个错误 NULL(无)被认为与另一个 NULL 不同,因此使用 NOT NULL 来确保您不能引用 NULL。
    • ON DELETE CASCADEON UPDATE CASCADE,如果父级为 UPDATE 或 DELETED,则所有子行分别为 UPDATE 或 DELETED。这可以简单地维护(又名不是孤儿)。

在编写任何代码之前,最好用一些数据测试上述结构。您可能想要下载一个 SQlite 管理工具,例如 DB Browser for SQLite、Navicat、DB Beaver 等。使用此类工具,您可以创建表格、加载数据提取数据等。

因此,使用您最喜欢的 SQLite 管理工具,您可以使用上面的 SQL 创建表,然后使用以下方法加载一些数据:-

INSERT INTO room (roomName) 
    VALUES ('Room1') /* _id = 1 */,('Room2') /* _id = 2 */,
        ('Room3') /* _id = 3 and so on */,
        ('Room4'),('Room5'),('Room6'),('Room7'),
        ('Room8'),('Room9'),('Room10'),('Roomxx')
;
INSERT INTO person (personName, personEmail, personTypeIndicator)
    VALUES ('Fred','f@mail.x',0) /* _id = 1 */,
        ('Mary','m@mail.x',0) /* _id = 2 */,
        ('Jane','j@mail.x',0) /* _id = 3 and so on */,
        ('Bert','b@mail.x',0),('Prof Plum','pp@profmail.x',100)
;
INSERT INTO book (bookname,room_reference)
    VALUES ('Book1',1),('Book2',2),('Book3',3),('Book4',4),('Book5',5),
    ('Book6',6),('Some other Book',7),('Book8',8),('Book9',9),('Book10',10);
;
  • 插入了 11 个房间行,添加了 4 个人,并添加了 10 本书,每个引用(涉及)一个房间。

然后您可以使用:-

SELECT * FROM room;
SELECT * FROM person;
SELECT * FROM book;

查看数据(为简洁起见,未显示)。

现在有一些数据我们可以尝试根据 personTypeIndicator(0(无房间)和 1-10(相应的房间))使用房间的 _id 来找出房间中的学生作为房间 # 的指示器(您通常会这样做,因为对 _id 的实际值做出假设是错误的)。

以下 SQL 将执行此操作:-

SELECT * FROM book JOIN room ON room._id = book.room_reference LEFT JOIN person ON personTypeIndicator = book._id;

结果是:-

  • 正如预期的那样,所有学生都添加了 personTypeIndicator 为 0 并且没有 _id 为 0 的房间。

要测试上述查询并显示更新数据的示例,可以使用以下内容:-

UPDATE person SET personTypeIndicator = _id WHERE personTypeIndicator <= 10;
  • 请注意,这模拟了正在升级的学生,通过使用他们的 _id (1-4) 来更新 personTypeIndicator,但前提是 personTypeIndicator 为 10 或更少(因此 Plum 教授不会更改)。

如果现在运行查询,那么:-

如果上述适合,那么您应该与查询一起竞争设计数据库。然后,您可以继续在 App 中实现设计。

【讨论】:

  • 非常感谢您的宝贵时间!!!你给了一些光,所以现在我可以继续前进了!再次感谢。
  • @DaviPazzini,很好。如果您认为答案对您有所帮助,请勾选已回答。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2014-03-26
  • 2011-10-13
  • 2012-08-04
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多