安卓 - 从SQLite数据库加载值到ArrayList

7

我是一个新手,正在学习安卓开发。我有一个使用SQLite数据库的应用程序。 我需要将数据库中的值推送到类型为对象的ArrayList。 以下是我使用的代码。

 private ArrayList<objectname> objectList  = new ArrayList<objectname>();
 //function used to get values from database
   public ArrayList<objectname> getResults() {

    MyDb db = new MyDb(this); //my database helper file
    db.open();
    Cursor c = db.getAllValues(); //function to retrieve all values from a table- written in MyDb.java file
    if (c.moveToFirst())
    {
        do {         
            String date = c.getString(c.getColumnIndex("date"));

            try
            {
                ob = new objectname();
                ob.setDate(c.getString(c.getColumnIndex("date")));// setDate function is written in Class file
                objectList.add(ob);
            }
            catch (Exception e) {
             Log.e(MY_DEBUG_TAG, "Error " + e.toString());
            }

         } while (c.moveToNext());
    }
       db.close();
       return objectList;
}

这个功能没有正常工作。没有显示任何错误,但是我没有将值放入到arraylist对象objectList中。

请帮忙解决,谢谢!


创建数据库管理器实例时,“this”满足哪个参数?构造函数是什么样子的? - AlleyOOP
3个回答

7

试试这个:

private ArrayList<objectname> objectList  = getResults();

private ArrayList<objectname> getResults() {

    MyDb db = new MyDb(this); //my database helper file
    db.open(); 

    ArrayList<objectname> resultList = new ArrayList<objectname>();


    Cursor c = db.getAllValues(); //function to retrieve all values from a table- written in MyDb.java file
    while (c.moveToNext())
    {
        String date = c.getString(c.getColumnIndex("date"));

        try
        {
            ob = new objectname();
            ob.setDate(date);// setDate function is written in Class file
            resultList.add(ob);
        }
        catch (Exception e) {
            Log.e(MY_DEBUG_TAG, "Error " + e.toString());
        }

    }

    c.close();

    db.close();
    return resultList;
}

当我从代码中删除了db.close()并包含了c.close()时,它起作用了。但我认为db.open()和db.close()是必要的。但现在的问题是,在logcat中显示了一些错误和警告语句。WARN/SQLiteCompiledSql(10839): 在终结器中释放语句。请确保您明确调用了游标上的close()方法:WARN/SQLiteCompiledSql(10839): android.database.sqlite.DatabaseObjectNotClosedException: 应用程序没有关闭在此处打开的游标或数据库对象。close()从未在数据库上显式调用。还有一些其他的数据库错误也在显示。 - Aswini K
1
在 c.close() 后添加 db.close(); - runor49
1
感谢runor49的帮助。您的帮助真的很可贵,再次感谢您的帮助。您能否在给定链接中帮助我解决这个问题.. https://dev59.com/nGsz5IYBdhLWcg3wg4Gv - user1006506

2

我曾遇到与使用游标从数据库检索值并在屏幕上显示相关的类似问题。以下解决方案适用于我:

            Cursor cur = db.getAllValues();
            int index = c.getColumnIndex("date");
    cur.moveToFirst();

    while (cur.isAfterLast() == false) {
        System.out.println(cur.getString(index)); // For debug purposes
        String date = cur.getString(index);
        try {
            ob = new objectname();
            ob.setDate(date);
            resultList.add(ob);
        } catch (Exception e) {
            Log.e(MY_DEBUG_TAG, "Error " + e.toString());
        }
        cur.moveToNext();
    }
    cur.close();

1

可能您的查询没有结果,moveToFirst 返回 false。

在您的 if 语句之前记录 c.getCount() 的值如何?


1
那么你的代码应该可以工作。这是你正在使用的实际代码吗? - Matthew
谢谢Matthew Willis。我的实际代码看起来与我在这里发布的代码类似。 - Aswini K
1
可能实际代码和您发布的代码之间的差异是错误所在。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接