2013-09-27 2 views
0

У меня возникла следующая ошибка, когда я беру asyntake из Fragment и получаю доступ к sqlite, как следует.получил ошибку доступа sqlite от фрагмента

Вызванный: java.lang.NullPointerException на android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:224)

и вот мое кодирование. Я не знаю, почему я получил эту ошибку, хотя я уже объявляю «DatabaseUtil dbUtil = new DatabaseUtil (ctx);»

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     . 
     .. 

    } 



    public static class ContentFragment extends Fragment { 


     public ContentFragment() { 

     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.list_layout, container, false); 
      MainActivity myActivity = new MainActivity(); 
      MainActivity.GetDataTask asyncTask = myActivity.new GetDataTask(); 

      return rootView; 
     } 
    }  

    private class GetDataTask extends AsyncTask<Object, Void, Integer> { 

     protected void onPreExecute() { 

     }  

     @Override 
     protected Integer doInBackground(Object... args) { 

      DatabaseUtil dbUtil = new DatabaseUtil(ctx); 
       dbUtil.open(); 
         dbUtil.insertRecord(....); 
       dbUtil.close(); 

      return 1; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      super.onPostExecute(result); 
     } 
    } 
+0

, где ваш AsyncTask определяется в деятельности или framgent.? Я предлагаю вам сделать это в фрагменте и удалить этот 'MainActivity myActivity = new MainActivity()' – Raghunandan

+0

Определенные средства ?? Все эти asynctask и ContentFragment находятся в разделе Activity. Я немного изменил свою кодировку. Пожалуйста, проверь это. – ppshein

+0

Я вижу много чего не так в вашем коде. является asynctask внутренний класс вашего фрагмента? – Raghunandan

ответ

0

Вы ч п сделать конструктор для GetDataTask ....

Context ctx; 

public GetDataTask(Context c){ 

this.ctx = c; 

} 

Теперь вы можете использовать этот CTX переменная

DatabaseUtil dbUtil = new DatabaseUtil(ctx); 
+0

Правильно. Я забыл создать конструктор для GetDataTask .. – ppshein

+0

@ppshein Также проверьте этот https://groups.google.com/forum/#!topic/android-developers/1aPZXZG6kWk. если вам нужен контекст acitivty внутри статического внутреннего класса, вы должны иметь слабое отношение к нему, или это может привести к утечке памяти. Ответ на запрос CheckRomain Guy. прокрутите страницу вниз и проверьте последние несколько пунктов здесь. http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html – Raghunandan

1

Что вы делаете неправильно

MainActivity myActivity = new MainActivity(); 

Вы создаете экземпляр класса активности. Начало работы: startActivtiy(new Intent(params)). Активность имеет ui и жизненный цикл. Поэтому создание класса активности экземпляра od не требуется.

Предлагайте имеет AsyncTask в своем классе фрагмента

Также

DatabaseUtil dbUtil = new DatabaseUtil(getActivtiy()); 

отредактированного вопрос

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    . 
    .. 

    } 

Тогда в ContentFragment.java

public class ContentFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.list_layout, container, false); 
     new GetDataTask(getActivity()).execute(params); 
     return rootView; 
    } 
}  

class GetDataTask extends AsyncTask<Object, Void, Integer> { 

    Context mContext; 
    public GetDataTask(Activity activity) { 
    // TODO Auto-generated constructor stub 
    mContext = activity; 
} 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    }  

    @Override 
    protected Integer doInBackground(Object... args) { 

     DatabaseUtil dbUtil = new DatabaseUtil(mContext); 
      dbUtil.open(); 
        dbUtil.insertRecord(....); 
      dbUtil.close(); 

     return 1; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
    } 
} 
+0

Извините. Это моя ошибка. Я редактировал свое кодирование. asynctask - внутренний класс моего фрагмента. Как исправить? – ppshein

+0

, затем попробуйте 'new GetDataTask() выполнить (lastrecordfromlocal, userdefined)' и удалить этот 'MainActivity myActivity = new MainActivity()' – Raghunandan

+0

, когда я так пытаюсь, получить эту ошибку "Нет закрывающего экземпляра типа MainActivity. выделение с охватывающим экземпляром типа MainActivity (например, xnew A(), где x является экземпляром MainActivity). " – ppshein

Смежные вопросы