Android - 使用数据库游标

时间:2016-09-03 13:53:41

标签: android android-sqlite android-cursor android-database

我在我的应用程序中实现了一个sqlite数据库,并且我使用了Android Cursor。我用例如一个数据库编写了一个数据库类。数据库名称以及表和列名称。在这里,我也有各种方法,如下所示:

public Cursor getCorrectQuestions(int topic) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor questionCursor = db.rawQuery(
            "Select * FROM Result, Question WHERE Result.qid = Question._id AND correct = 1 AND topic = " + topic,
            null);
    questionCursor.moveToFirst();
    return questionCursor;
}

public Cursor getExamQuestions() {
    SQLiteDatabase db = getReadableDatabase();
    Cursor questionCursor = db.rawQuery("Select * FROM Question WHERE topic = 7", null);
    questionCursor.moveToFirst();
    return questionCursor;
}

public Cursor getAnswerItems(String id) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor answerCursor = db.rawQuery(
            "Select * FROM Answer, Question WHERE Question._id = " + id + " AND Question._id = Answer.qid", null);
    answerCursor.moveToFirst();
    return answerCursor;
}

public Cursor getUserResults(String qid) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor userResultsCursor = db.rawQuery("SELECT result FROM Result, Answer WHERE Result.qid = " + qid, null);
    userResultsCursor.moveToFirst();
    return userResultsCursor;
}

在有3个游标的QuizActivity(answerCursor,questionCursor,userResultCursor)中,我调用了这些方法。 我的问题是:是否有必要在每个方法中创建一个SQLiteDatabase对象,还是可以在我的数据库构造函数中定义一次?我的活动中是否需要3种不同的游标,或者有更好的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

假设您编写的方法是SQLiteOpenHelper的一部分,那么您实际上并不是在创建3个数据库对象。只有第一次调用getReadableDatabase()实际上会创建一个数据库对象,后续调用会重新使用同一个对象。

您还需要为您执行的每个查询创建一个新的Cursor,因为它们在创建后无法编辑。从这个意义上说,没有办法简化你已经完成的工作。

就代码的改进而言,您可以查看以下几点:

  • 考虑将您的数据库放在ContentProvider中并通过URI访问它。这将需要更多的前期工作,但如果您希望与其他应用程序共享数据库或将来将数据同步到服务器,则会更容易。
  • 将光标置于默认位置(不要调用moveToFirst())。这样当调用者收到游标时,它可以使用以下代码开始迭代游标行而不执行任何进一步的检查:

    while (cursor.moveToNext()) {
        // extract data
    }
    

    这是因为从查询返回的游标最初位于之前第一行数据,因此如果游标为空,则while循环中的代码根本不会执行。