Ошибка SimpleCursorLoader onCreateLoader, несоответствие возвращаемого типа

Я использую базу данных SQLite и хочу загрузить ее без использования ContentProvider,

У меня возникают проблемы при получении моего SimpleCursorLoader с подклассами (взятый из использования CursorLoader без ContentProvider) для работы с LoaderManager,

В перезаписанном методе

@Override
public Loader<Cursor> onCreateLoader(int ID, Bundle args) {
    return new ListCursorLoader(this, dBHelper);

}

Я получаю несоответствие типов, говоря, что он не может конвертировать из ListCursorLoader в Loader<Cursor>, Я пытался создать ListCursorLoader на лету (то есть в методе), но это тоже не работает.

Вот код для моего ListCursorLoader:

package utilities;

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

public class ListCursorLoader extends SimpleCursorLoader {
    private DBAdapter dBAdapter;

    public ListCursorLoader(Context context, DBAdapter adapter) {
        super(context);
        dBAdapter = adapter;
    }

    @Override 
    public Cursor loadInBackground() {
        Cursor cursor = null;
        dBAdapter.open();
        try {
            cursor = dBAdapter.getAllQueries();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (cursor != null) {
            cursor.getCount();
        }
        return cursor;
    }
}

Как видите, я только перезаписал loadInBackground() метод, и я просто не вижу, что я делаю неправильно.

Надеюсь, вы, ребята, можете помочь!

1 ответ

Решение

Я только что попробовал ваш код, и он работал без проблем.

Вы должны перепроверить ваш импорт. SimpleCursorLoader, на который вы ссылаетесь, использует библиотеку поддержки. Вы не предоставили код, но я думаю, что вы можете использовать LoaderManager по умолчанию, а не тот, который предоставляется библиотекой поддержки.

Так что для того, чтобы вы могли использовать этот класс, вам нужно ссылаться android.support.v4.content.Loader и загрузить его с помощью SupportLoaderManager в вашем фрагменте.

Вот код из моего фрагмента, который работал: (Обратите внимание на использование библиотеки поддержки.)

import android.database.Cursor;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
...

public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor>{
...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getSupportLoaderManager().initLoader(0, null, this);
    }

...

@Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        return new ListCursorLoader(this);
    }

...

}
Другие вопросы по тегам