2016-07-17 6 views
0

Ниже приведен фрагмент кода из учебника по Android, за которым я следил. loadInBackground получает курсор, а затем cursor.getCount(), чтобы «обеспечить заполнение окна содержимого». Что это значит? Документы на getCount просто говорят: «возвращает количество строк в курсоре». У меня есть Googled для этого «убедитесь, что окно содержимого заполнено», и есть множество фрагментов, которые делают это, все с одним и тем же комментарием, но не объясняют, почему это необходимо/как это работает.Курсор # getCount используется для обеспечения заполнения окна содержимого?

import android.content.AsyncTaskLoader; 
import android.content.Context; 
import android.database.Cursor; 

public abstract class SQLiteCursorLoader extends AsyncTaskLoader<Cursor> { 

    private Cursor cursor; 

    public SQLiteCursorLoader(Context context) { 
     super(context); 
    } 

    protected abstract Cursor loadCursor(); 

    @Override 
    public Cursor loadInBackground() { 
     Cursor cursor = loadCursor(); 
     if (cursor != null) { 
      cursor.getCount(); // ensure that the content window is filled 
     } 
     return cursor; 
    } 

} 
+0

Действительно ... спросите разработчика, который написал этот комментарий, что он/она имел в виду. –

+0

@BobMalooga Я вижу ту же строку кода во многих местах, поэтому я подумал, что это может быть стандартная вещь. Эта строка 'getCount' не нужна? –

+0

Это ничего, кроме времени. –

ответ

2

Как вы знаете, базы данных возвращает Cursor после query. Тем не менее, курсор фактически заполняется данными, когда вы пытаетесь прочитать некоторую информацию, например: или cursor.moveToFirst() и т. Д.

Это более очевидно при больших запросах.

Например, представьте, что запрос ниже будет возвращать тысячу результатов:

Cursor cursor = db.rawQuery("select * from TABLE", null); 

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

Однако, когда вы, наконец, позвонить cursor.getCount() или cursor.moveToFirst(), в первый раз вы можете увидеть некоторое «отставание», поскольку курсор эффективно заполняется данными из базы данных.

Если вы делаете это в главной теме пользовательского интерфейса, приложение может зависнуть на несколько секунд. Специально на устройствах с низким уровнем.

Итак, позвонив по этому методу, я считаю, что автор пытается обеспечить полную загрузку данных во время loadInBackground(). Таким образом, он гарантирует, что данные загружены в Background, а не в какой-либо другой будущий метод. Таким образом, любой будущий вызов getCount() или moveToFirst() будет выполнен очень быстро, поскольку данные уже были загружены.

В любом случае, это необязательно.