2016-09-03 9 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; 
} 

В QuizActivity, который имеет 3 курсоров (answerCursor, questionCursor, userResultCursor) Я вызывать эти методы. Мой вопрос: необходимо ли создать объект SQLiteDatabase в каждом методе или можно ли определить его один раз в моем конструкторе базы данных? И мне нужно 3 разных курсора в моей деятельности или есть лучший способ справиться с этим?

ответ

2

Предполагая, что методы, которые вы написали, являются частью SQLiteOpenHelper, вы на самом деле не создаете 3 объекта базы данных. Только первый вызов getReadableDatabase() фактически создает объект базы данных, а последующие вызовы повторно используют один и тот же объект заново.

Вы также должны сделать новый Cursor для каждого выполняемого вами запроса, поскольку они не могут быть отредактированы после создания. В этом смысле нет способа упростить то, что вы уже сделали.

Насколько улучшения вашего кода, есть несколько вещей, которые вы можете посмотреть по адресу:

  • Рассмотреть вопрос о создании базы данных в ContentProvider и доступ к нему с помощью адресов URI. Это потребует больше предварительной работы, но будет намного проще, если вы захотите поделиться своей базой данных с другими приложениями или синхронизировать свои данные с сервером в будущем.
  • Оставьте курсор в положении по умолчанию (не вызывайте moveToFirst()). Таким образом, когда вызывающий абонент получает курсор, он может использовать следующий код, чтобы начать перебор курсора строку без выполнения каких-либо дальнейших проверок:

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

    Это потому, что курсор возвращается из запроса изначально расположены перед тем первого строка данных, поэтому, если курсор пуст, код внутри цикла while просто не выполняется вообще.

 Смежные вопросы

  • Нет связанных вопросов^_^