2016-09-03 20 views
0

我已经在我的应用程序中实现了一个sqlite数据库,并且使用了Android Cursor。我已经写了一个数据库类,例如数据库名称以及表和列名称。在这里,我也有不同的方法,如下所示: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个不同的游标?还是有更好的方法来处理这个问题?

回答

2

假设你写的方法是SQLiteOpenHelper的一部分,你并不是真正创建3个数据库对象。只有第一次调用getReadableDatabase()实际上会创建一个数据库对象,随后的调用再次重复使用同一个对象。

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

至于改善你的代码中,有几件事情,你可以看看:

  • 考虑把你的数据库在ContentProvider并通过URI的访问它。这需要更多的前期工作,但如果您想与其他应用程序共享您的数据库或将您的数据同步到服务器,将使它更容易。
  • 将光标保留在默认位置(不要拨打moveToFirst())。这样,当主叫方接收到的光标,它可以用下面的代码而不进行任何进一步的检查,以开始迭代光标行:

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

    这是因为从查询返回的光标最初位于所述第一前一行数据,所以如果游标是空的,那么while循环内的代码根本就不会执行。