【问题标题】:Nested ArrayList and manual database entry嵌套 ArrayList 和手动数据库输入
【发布时间】:2016-07-20 12:28:11
【问题描述】:

我正在 Android 中开发一个看起来像这样的 RecyclerView:

一个

一个话题1

一个话题2

一个话题3

B

B 主题1

B 话题2

在您点击父字母之前隐藏主题。

我有一些我认为应该可以工作的东西,但是现在如果我手动将行添加到我的数据库中(这是设计使然),无法识别其他行,即使我卸载应用程序并将其重新加载。这就是我正在查看的内容:

final List<AToZList> aToZ = addTopics();
mAdapter = new AToZAdapter(getContext(), aToZ);

...

private List<AToZList> addTopics() {
        topics = new ArrayList<Topic>();
        List<AToZList> aToZ;
        AToZList A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
        A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z = null;

        Cursor topicCursor = database.rawQuery("SELECT " + ExternalDbContract.QuoteEntry.TOPIC +
                " FROM " + ExternalDbContract.QuoteEntry.TABLE_NAME, null);

        try {
            for (topicCursor.moveToFirst(); !topicCursor.isAfterLast(); topicCursor.moveToNext()) {
                String firstLetter = topicCursor.getString(0).toUpperCase().substring(0, 1);

                switch (firstLetter) {
                    case "A":
                        if(A == null) {
                            A = new AToZList("A", getTopics(firstLetter));
                        }
                        break; //and so on for every letter
                }finally {
                    aToZ = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z);
                }
    topicCursor.close();
    return aToZ;

...

private ArrayList<Topic> getTopics(String firstLetter) {
        Cursor topicCursor = database.rawQuery("SELECT " + ExternalDbContract.QuoteEntry.TOPIC +
                " FROM " + ExternalDbContract.QuoteEntry.TABLE_NAME, null);

        ArrayList<Topic> topicsByLetter = new ArrayList<Topic>();

        for(topicCursor.moveToFirst(); !topicCursor.isAfterLast(); topicCursor.moveToNext()) {
            if (topicCursor.getString(0).toUpperCase().substring(0, 1).equals(firstLetter)) {
                topicsByLetter.add(new Topic(topicCursor.getString(0)));
            }
        }
        topicCursor.close();
        return topicsByLetter;
    }

代码太多了。

我添加了一些日志记录以查看实际通过的内容。我在数据库中有 3 个主题条目,两个以“A”开头,第三个以“B”开头。 A 可以通过(有两个条目),然后由于某种原因它踢到 finally 块,并破坏了数组,因为它只有一个条目(如一个“A”条目)。 topicCursor.getCount() 告诉我只有两个条目,但有三个。诅咒你的游标!

如果有帮助,我已提交where I'm at onto Github

编辑:我已经编辑了数据库本身以容纳完全不同的主题名称,并且它继续显示以前的主题。我已经从我的测试设备上卸载了该应用程序,所以我真的不确定数据来自哪里。但这似乎确实与数据库有关。

【问题讨论】:

    标签: android sqlite arraylist cursor android-recyclerview


    【解决方案1】:

    啊啊啊,问题解决了。

    首先,数据库一直停留,直到我卸载重新启动。出于某种原因,简单的卸载是不够的。

    我发布的代码按预期工作。只是无法将其他为 null 的参数传递到 ArrayList 中(应该在添加任何参数之前添加一个检查)。一旦我缩小到只有 A 和 B,所有错误都被删除了。

    教训如下:如果您将手动条目添加到数据库中,则只有在您卸载应用并重新启动后才会反映任何更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多