我正忙于开发一款只读图书阅读器应用程序,该应用程序有一个数据库和 3 个表。一张称为章节的表,其中章节有名称,一张称为子章节的表,其中章节是编号,一张称为条目的表,其中子章节表的文本内容。每个条目也会有一个编号,以便更好地组织。
chapters 表有两列:id 和 name
subchapters 表有两列:id 和 number
entries 表有两列:id 和 text
我已经生成了原始查询,以在活动开始时从条目表中提取随机文本条目,并且工作正常。但是,我需要两件事:
当随机文本显示在视图中的活动屏幕上时,我需要它不仅提供文本,还提供章节名称和子章节编号。
单击该视图时,我需要它将用户带到该文本所在的子章节,然后用户可以在其中阅读和/或导航等..
我遇到的问题是我需要应用程序能够知道随机文本条目来自哪个章节和子章节以及条目,以便它可以显示它,然后将用户带到那里单击。
我知道它与 JOIN 有关,我已经观看了很多教程并阅读了这里的很多帖子,但我还没有看到类似我正在谈论的内容,或者我只是不理解它看到其他不相关的示例。
这是我当前获取随机文本条目的 rawQuery:
public List<String> getRandomTextEntry() {
List<String> list = new ArrayList<>();
Cursor cursor = database.rawQuery("SELECT * FROM entries ORDER BY
RANDOM() LIMIT 1", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
list.add(cursor.getString(1));
cursor.moveToNext();
}
cursor.close();
return list;
}
非常感谢任何对此的帮助。
为什么要使用多个表?在我看来,最好只有一张包含以下列的表:id、chapter、subchapter 和 text。 当然,您必须多次使用相同的章节名称和相同的子章节编号,但是然后您执行文本列查询,在这种情况下,同时您可以获取它是哪个章节以及哪个子章节。 本教程很好地描述了如何处理多列: https://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
但是如果您仍然想使用多个表并“链接”它们,我建议遵循本教程: https://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/ 它基本上做的和你想要的完全一样。
我需要应用程序能够知道随机文本输入来自哪个章节和子章节以及条目
您描述的表格没有告诉您条目所在的章节或子章节,因此它们无法回答您的查询。
PS
您可以有一个基表 CSE,其中保存“C 章子章 S 条目为 E”的行。然后,您可以使用“C 章子章 S 条目是 ID AND 条目 ID 文本是 TEXT AND E=ID”的行表来搜索文本,即 select * from CSE inside join Entries on E=ID。但是:CSE 和章节等不能只包含任何值。例如,章节 ID 是唯一的,即 count(select ID from Chapters) = count(Chapters)——超键(SQL UNIQUE NOT NULL)约束,SQL PK(主键)约束的候选者。例如,CSE C 值必须是章节 ID 值,即从 CSE 中选择 C <= select ID as C from Chapters--part of a FK (foreign key) constraint. Eg if there are no empty chapters then select C from CSE >= 从章节中选择 ID 作为 C。
或者你可以有基表CS“章节C包含子章节S”和SE“子章节S包含条目E”,所以CSE = CS自然连接SE。不幸的是,这需要很多其他约束,归结为(令人惊讶)CSE = CS 自然连接 SE。
您不想只使用一个基表而不是 CSE 和其他 3 个基表,因为每次出现章节 id 时它都具有相同的名称并且每次出现子章节 id 时它都具有相同的编号,这会使约束变得复杂。
这并不意味着 CSE + 你的 3 个表是最好的设计或好的设计。我只是说明您需要找到表行成员资格条件(表(特征)谓词)以及相应的必要且足以描述您的业务情况的基表以及该选择会产生影响。
是时候阅读有关信息建模、关系模型和数据库设计的教科书了。 (注意——设计工具、API 或记录设计的语言的手册不是设计手册/教程。)