我正忙于一个具有一个数据库和3个表的只读书阅读器应用程序。一张表称为章,其中各章具有名称,一张表称为子章,其中各章是数字,另一张表称为条目,即条目,它是子章节表的文本内容。每个条目都会有一个编号,以便更好地组织。
章节表具有两列:id和name
subchapters表具有两列:id和number
条目表具有两列:id和text
我已经生成了rawquery,以在活动开始时从条目表中提取随机文本条目,并且工作正常。但是,我需要两件事:
当随机文本显示在视图的活动屏幕上时,我不仅需要提供文本,还要提供章节名称和子章节号。
单击该视图时,我需要它将用户带到该文本的子章节,用户可以在其中阅读和/或浏览等等。
我遇到的问题是,我需要该应用程序能够知道随机文本输入来自哪个章节,子章节和条目,以便它可以显示它,然后将用户带到那儿。
我知道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;
}
任何帮助,我们将不胜感激。
答案 0 :(得分:1)
为什么要使用多个表?我认为,最好只包含一个带有以下各列的表:id,章,子章节和文本。 当然,您必须多次使用相同的章节名称,也可能使用相同的子章节编号,但是您需要进行文本列查询,在这种情况下,您可以同时获得该章节和哪个子章节。 本教程非常好地介绍了如何处理多列: https://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
但是,如果您仍然想使用多个表并“链接”它们,我建议您遵循本教程: https://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/ 它基本上在做您想要的事情。
答案 1 :(得分:1)
我需要该应用程序能够知道随机文本输入来自哪个章节,子章节和条目
您描述的表格不会告诉您条目所在的章节或子章节,因此它们无法回答您的查询。
PS
您可能有一个基表CSE,其中包含“第C章,第S子条目是E”的行。然后,您可以使用该表搜索文本,其中“第C章子章S条目是ID,而条目ID文本是TEXT AND E = ID”,该行在E = ID的CSE内部联接条目中选择*。但是:CSE和章节等不能仅包含任何值。例如,章节ID是唯一的,即count(从章节中选择ID)= count(章节)-超键(SQL UNIQUE NOT NULL)约束,是SQL PK(主键)约束的候选。例如,CSE C值必须是章节ID值,即从CSE中选择C <=从章节中选择ID作为C,这是FK(外键)约束的一部分。例如,如果没有空的章节,则从CSE中选择C> =从章节中选择ID作为C。
或者您可能具有基本表CS“ C章包含子章S”和SE“ S章包含项E”,所以CSE = CS自然加入SE。不幸的是,这需要很多其他约束条件,最终导致说(惊奇)CSE = CS自然加入SE。
您不想只使用一个基本表而不使用CSE以及其他3个表,因为它使约束变得更加困难,即每次出现的章节ID都具有相同的名称,而每次出现的子章节ID都具有相同的名称。数字。
这并不意味着CSE +您的3张桌子是最佳设计或最佳设计。我只是在说明,您需要查找表行成员条件(表(特征)谓词)和必要的,足以描述您的业务状况的基本表,并且选择具有影响力。
该阅读有关信息建模,关系模型和数据库设计的教科书了。 (注:关于设计工具,API或用于记录设计的语言的手册不是关于设计的手册/教程。)