@Eserchik

Android (CursorLoader если cursor=null)?

Люди помогите найти решение.
У меня в начальный момент БД пустая, соответственно Cursor=null, при этом приложение падает
Помогите найти решение.

Дамп стека

this AsyncTaskLoader$LoadTask (id=830023124712)
done CountDownLatch (id=830023124872)
mFuture AsyncTask$3 (id=830023124800)
mStatus AsyncTask$Status (id=830013473536)
mTaskInvoked AtomicBoolean (id=830023124760)
mWorker AsyncTask$2 (id=830023124776)
result SQLiteCursor (id=830023131016)
mClosed false
mColumnNameMap null
mColumns String[14] (id=830023131696)
mContentObservable ContentObservable (id=830023131192)
mContentResolver null
mCount -1
mCurrentRowID null
mDataSetObservable DataSetObservable (id=830023131152)
mDriver SQLiteDirectCursorDriver (id=830023130248)
mEditTable "orders" (id=830023108288)
mExtras Bundle (id=830013475456)
mNotifyUri null
mPos -1
mQuery SQLiteQuery (id=830023130328)
mRowIdColumnIndex 0
mSelfObserver null
mSelfObserverLock Object (id=830023131232)
mSelfObserverRegistered false
mStackTrace DatabaseObjectNotClosedException (id=830023131304)
mUpdatedRows HashMap (id=830023131248)
mWindow null
this$0 FragmentOrdersNew$MyCursorLoader (id=830023123688)
waiting false


Метод отвечающий за формирования списка

private void getData(){
		
     db=new DB(getActivity());
     db.open();
        
		c = db.getData(orderStatus);

                 lm = getLoaderManager();
		lm.initLoader(0, null, this);
		
		if(c!=null && c.getCount()>0){
	        
                 while(c.moveToNext()){
				String[] from = new String[] {DB.COLUMN_EXT_ID};
				int[] to = new int[] {R.id.tvExId};
				adapter = new CustomAdapterOrders(getActivity(), R.layout.orders_list, c, from, to,lm,db,orderStatus,tehGuid,tehToken);
				setListAdapter(adapter);
                        }
     }


CursorLoader

@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		// TODO Auto-generated method stub
		 return new MyCursorLoader(getActivity(), db);
	}

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

	@Override
	public void onLoaderReset(Loader<Cursor> arg0) {
		// TODO Auto-generated method stub
		adapter.swapCursor(null);
	}
	
	
	static class MyCursorLoader extends CursorLoader {
        DB db;
	    
	    public MyCursorLoader(Context context, DB db) {
	      super(context);
	      this.db = db;
	    }
	    
	    @Override
	    public Cursor loadInBackground() {
                 //В начальный момент база данных пустая
	         c = db.getData(orderStatus);
          
	     return c;
	    }
	    
	  }
  • Вопрос задан
  • 2822 просмотра
Решения вопроса 1
Adapter пустой потому что.
В методе getData вы получаете Cursor и инициализируете Loader. Поскольку Cursor пуст, ветка if не срабатывает и adapter не инициализируется. Далее Loader завершает свою загрузку методом onLoadFinished, в котором вызывается adapter.swapCursor(c). adapter - null, поэтому получаем краш.

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
    if (adapter != null) {
        adapter.swapCursor(c);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    if (adapter != null) {
        adapter.swapCursor(null);
    }
}


Ещё вы инициализируете adapter в цикле, что делать не надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы