Andy
Andy

Reputation: 10850

Why is my LoaderManager/CursorLoader combo not working correctly in displaying a database query in a ListView?

I have been working all day on this, and have been trying to understand how it all fits together and reworking my code to fit together well.
So I will show you what I have. There is no error, just blank.

MyAgendaLoaderManager.java:

public class MyAgendaLoaderManager implements LoaderCallbacks<Cursor>{

MyAgendaAdapter agendaAdapter;
Context mContext;
String date;

public MyAgendaLoaderManager(Context context, MyAgendaAdapter adapter, String date) {
    agendaAdapter = adapter;
    mContext = context;
    this.date = date;
}

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    Uri baseUri = SmartCalProvider.CONTENT_URI;
    return new CursorLoader(mContext, baseUri, 
            new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"}, 
            "WHERE date(?) >= start_date and date(?) <= end_date", new String[]{date, date}, null);
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    // TODO Auto-generated method stub
    agendaAdapter.swapCursor(arg1);
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    // TODO Auto-generated method stub
    agendaAdapter.swapCursor(null);
}

}

CalProvider.java:

public class SmartCalProvider extends ContentProvider {
public static final String AUTHORITY = "content://com.smartcal.eventprovider";
public static final Uri CONTENT_URI = Uri.parse(AUTHORITY);

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "cal.db";

private SmartCalOpenHelper openHelper;
private SQLiteDatabase database;

@Override
public boolean onCreate() {
    openHelper = new SmartCalOpenHelper(getContext());
    return true;
}


@Override
public String getType(Uri uri) {
    return null;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    database = openHelper.getWritableDatabase();
    return database.query("events_info", projection, selection, selectionArgs, null, null, null);
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    return null;
}

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
    return 0;
}


@Override
public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    return 0;
}
}

And if it matters, heres the code that runs it in the main activity:

agendaAdapter = new MyAgendaAdapter(this, null);
MyAgendaLoaderManager loader = new MyAgendaLoaderManager(this, agendaAdapter, getChosenDate());

I just don't see how it blanks. Please keep in mind I intentionally left some stuff blank in the CursorLoader, and LoaderManager because I did not want to fill it all in to find out there was an error, so I was just testing to see if the initial list was display, and it was not. Any help figuring out what I did wrong would be much appreciated.

EDIT: Actually, now that I think about it, there is nothing that actually ties what I am doing to a specific list besides when my adapter makes the view that holds it. But that view isn't part of the regular layout. So maybe thats an error I have, unfortunately I have no idea how to do so.

Upvotes: 0

Views: 1189

Answers (1)

Nikolay Elenkov
Nikolay Elenkov

Reputation: 52966

You shouldn't instantiate a loader directly. You need to go through the activities getLoaderManager() method for it to be properly initialized and started. So from your activity call getLoaderManager().initLoader()/restartLoader() as needed.

Upvotes: 2

Related Questions