2015-09-21 2 views
3

Я пытаюсь реализовать Cursor Loader и Custom Cursor Adapter с базой данных (локальная база данных Sqlite) в моим проектом Android. Я на самом деле хочу асинхронно кормить свой список с данными из моей локальной базы данных с помощью Cursor Loader и Adapter`. Ниже есть мой класс, подкласс и методыОбъект, возвращаемый с onCreateLoader, не должен быть нестационарным внутренним классом-членом: DumbLoader

 // Home Activity class 
     public class HomeActivity extends FragmentActivity implements LoaderCallbacks<Cursor> { 
       DotCursorAdapter mAdapter; 
       private ListView lv; 
       private final int LOADER_ID = 1932; 

     DatabaseHandler dbHelper = new DatabaseHandler(this); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
       setContentView(R.layout.home_activity); 
      lv = (ListView) findViewById(R.id.lists); 


      mAdapter = new DotCursorAdapter(this, null,0); 
      lv.setAdapter(mAdapter); 

      getSupportLoaderManager().initLoader(LOADER_ID, null, this); 
     } 





     @Override 
     public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
      return new DumbLoader(this); 
     } 
     @Override 
     public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
      mAdapter.swapCursor(cursor); 
     } 
     @Override 
     public void onLoaderReset(Loader<Cursor> cursorLoader) { 
      mAdapter.swapCursor(null); 
     } 



     /** 
     * DumbLoader sub class 
     */ 
     public class DumbLoader extends CursorLoader { 
      private static final String TAG = "DumbLoader"; 
      public DumbLoader(Context context) { 
       super(context); 
      } 
      @Override 
      public Cursor loadInBackground() { 
       Cursor c = dbHelper.fetchAllCountries(); 

       return c; 

      } 
     } 






     /** 
     * DotCursor Adapter sub class 
     */ 
     public final class DotCursorAdapter extends CursorAdapter { 

      public DotCursorAdapter(Context context, Cursor cursor, int flags) { 
        super(context, cursor, 0); 
       } 



      @Override 
      public void bindView(View view, Context context, Cursor cursor) { 

        // Find fields to populate in inflated template 
        TextView tvBody = (TextView) view.findViewById(R.id.header_text); 

        String body = cursor.getString(cursor.getColumnIndexOrThrow("fname")); 
        // Populate fields with extracted properties 
        tvBody.setText(body); 


      } 
      @Override 
       public View newView(Context context, Cursor cursor, ViewGroup parent) { 
        return LayoutInflater.from(context).inflate(R.layout.list_cardview_activity, parent, false); 
       } 
      } 
    } 

Ниже также мой метод обработчика базы данных, который извлекает данные из базы данных.

public Cursor fetchAllCountries() { 
    SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor mCursor = db.query(TABLE_LOGIN, new String[] {KEY_ID,KEY_FIRSTNAME}, 
     null, null, null, null, null); 

     if (mCursor != null) { 
     mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

Проблема Исполняя эти коды над ним дает ошибку сообщения из журнала кошки и craches приложения.

главной ошибка

Объект вернулся из onCreateLoader не должна быть нестатическим внутренним классом -члена

Ниже также моих бревенчатых детали кошки

09-21 16: 13: 25.563: D/AbsListView (26541): Get MotionRecognitionManager 09-21 16: 13: 25.568: D/AndroidRuntime (26541): выключение VM 09-21 16: 13: 25.573: W/dalvikvm (26541): threadid = 1: нить, выходящая с неперехваченное исключение (группа = 0x411372a0) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): FATAL EXCEPTION: main 09-21 16: 13: 25.573: E/AndroidRuntime (26541): java.lang.RuntimeException: Не удалось запустить Деятельность ComponentInfo {com.alliswell.alliswell/com.alliswell.alliswell.HomeActivity}: java.lang .IllegalArgumentException: Объект вернулся из onCreateLoader не должен быть нестатический внутренний класс член: DumbLoader {418dc668 ID = 0} 09-21 16: 13: 25,573: Е/AndroidRuntime (26541): на android.app. ActivityThread.performLaunchActivity (ActivityThread.java:2110) 09-21 16:13 : 25.573: E/AndroidRuntime (26541): at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2135) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.app.ActivityThread .access $ 700 (ActivityThread.java:140) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1237) 09-21 16 : 13: 25.573: E/AndroidRuntime (26541): at android.os.Handler.dispatchMessage (Handler.java:99) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.os .Looper.loop (Looper.java:137) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.app.ActivityThread.main (ActivityThread.java:4921) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at java.lang.reflect.Method.invokeNative (родной метод) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at java. lang.reflect.Method.invoke (Method.java:511) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 1038) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:805) 09-21 16:13:25.573: E/AndroidRuntime (26541): at dalvik.system.NativeStart.main (родной метод) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): вызвано: java.lang.IllegalArgumentException: Object Возврат из onCreateLoader не должен быть нестационарным внутренним классом-членом: DumbLoader {418dc668 id = 0} 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.support.v4.app. LoaderManagerImpl $ LoaderInfo.start (LoaderManager.java:257) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.support.v4.app.LoaderManagerImpl.doStart (LoaderManager.java:714) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.support.v4.app.FragmentActivity.onStart (FragmentActivity.java: 556) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1178) 09-21 16: 13: 25.573: E/AndroidRuntime (26541)): at android.app.Activity.performStart (Activity.java:5198) 09-21 16: 13: 25.573: E/AndroidRuntime (26541): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2083) 09-21 16: 13: 25,573: E/AndroidRuntime (26541): ... 11 более

Я думаю, что я делаю что-то неправильно в моих кодов, я был бы признателен, если кто-то может помочь мне решить Эта проблема. Спасибо.

+2

Ошибка довольно ясна: переместите класс DumbLoader за пределы класса HomeActivity или сделайте его статическим. – Luksprog

+0

public * static * class DumbLoader extends CursorLoader {...} –

ответ

3

У вас есть 2 способа исправить это:

1.- Создать DumbLoader.java файл и установить его так:

public class DumbLoader extends CursorLoader { 

    private DatabaseHandler mDBHelper; 

    public DumbLoader(Context context, DatabaseHandler dhHelper) { 
     super(context); 
     mDBHelper = dbHelper; 
    } 

    @Override 
    public Cursor loadInBackground() { 
     return mDBHelper.fetchAllCountries(); 
    } 
} 

2.- Используйте static модификатор для DumbLoader вложенного класса Activity, с тем он получает следующее:

public class HomeActivity extends FragmentActivity implements LoaderCallbacks<Cursor> { 

    //onCreate(), etc... 

    //Make DumbLoader nested class STATIC 
    public static class DumbLoader extends CursorLoader { 

     private DatabaseHandler mDBHelper; 

     public DumbLoader(Context context, DatabaseHandler dhHelper) { 
      super(context); 
      mDBHelper = dbHelper; 
     } 

     @Override 
     public Cursor loadInBackground() { 
      return mDBHelper.fetchAllCountries(); 
     } 
} 
+0

Это не скомпилирует, передайте dbHelper в конструкторе -> прибыль. –

+0

@EugenPechanec Thats true, я исправлю это – BamsBamx