android 如何创建此数据库?

epfja78i  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(116)

申请表包括学生注册表。代码根据他的英语水平将他们移动到某个房间。房间里有一位教授,水平使用一本特定的书,书中有多个章节,并根据章节进行练习。
如何创建此数据库?

2guxujil

2guxujil1#

第一步是设计数据库,这将从识别数据集开始,这些数据集将转换为包含分组值列表的表。

所以你已经确定了房间,学生?,书籍,章节和节选和教授。这些可能是表的候选项。
表由行组成,每行具有相同的列数。列将保存相同类型的数据,例如。房间名称

Room表,听起来可能没有多少信息,比如房间的号码或名称。为了使到目前为止提到的所有表都变得简单/有效,最好使用id标识符,以便在将房间与其他表关联时轻松有效地识别房间。

因此,您的Room表可以使用SQL沿着以下方式创建:-

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

学生和教授,因为这些都是人,可能会分享很多相同的信息,那么两者都可以在同一个表中,也许Poeple与其他数据,如姓名,电子邮件等,一列,以表明这个人是学生或教授或其他类型的人。你提到了级别(这可以用来区分教授,例如如果英语的等级是1-10,那么如果等级大于10,那么它可以指示教授)。
所以你的Person表可能是这样的:

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

书籍、章节和节录

  1. 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);
  2. 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);
  3. 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中的一个bug,NULL(nothing)被认为与另一个NULL不同,因此使用NOT NULL来确保您无法引用NULL。
    *ON DELETE CASCADEON UPDATE CASCADE,如果父行为UPDATE或DELETED,则所有子行分别为UPDATE或DELETED。这可以简单地维持(又名不是孤儿)。

在编写任何代码之前,明智的做法是用一些数据测试上面的结构。您可能需要下载一个SQlite管理工具,如用于SQLite的DB浏览器,Navicat,DB Beaver等。使用这些工具,您可以创建表,用数据加载它们,提取数据等等。
因此,使用您最喜欢的SQLite管理工具,您可以使用上面的SQL创建表,然后使用以下命令加载一些数据:

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

你可以用途:

  1. SELECT * FROM room;
  2. SELECT * FROM person;
  3. SELECT * FROM book;

查看数据(为简洁起见未显示)。
现在有一些数据,我们可以尝试根据personTypeIndicator(0(没有房间)和1-10(相应的房间))来找出房间中的学生,为了简洁/简单起见,使用房间的_id作为房间#的指示符(你通常会这样做,因为假设_id的实际值是错误的)。
下面的SQL语句可以做到这一点:

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

结果将是:

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

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

  1. UPDATE person SET personTypeIndicator = _id WHERE personTypeIndicator <= 10;
  • 请注意,这模拟了正在升级的Students,通过使用他们的_id(1-4)来更新personTypeIndicator,但仅当personTypeIndicator为10或更小时(因此Prof Plum未更改)。

如果查询现在运行,则:-

如果以上情况适合,那么你应该设计数据库沿着查询。然后,您可以在应用程序中实现设计。

展开查看全部

相关问题