【问题标题】:Android - Efficient way using the Database CursorAndroid - 使用数据库光标的有效方式
【发布时间】:2017-01-11 11:19:41
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    假设您编写的方法是 SQLiteOpenHelper 的一部分,您实际上并没有创建 3 个数据库对象。只有对getReadableDatabase() 的第一次调用实际上创建了一个数据库对象,随后的调用再次重用相同的对象。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 2014-07-29
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多