2015-12-17 5 views
0

Мое приложение падает при запуске журнала, показывает, что ошибка возникает, когда я пытаюсь получить читаемую базу данных, кажется, что у меня проблемы с контекстом, но я не знаю, что делать i ' я много искал и много чего делал.не может читать из базы данных SQlite

Я опубликую свои уроки и журналы.

Мой фрагмент Класс

import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import com.example.ahmed.popularmovies.data.DbOpenHelper; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 



public class MainFragment extends Fragment { 

public final String API_KEY = "b932ba435fc93a5944938fe9d44cd198"; 
public final String BASE_URL = "http://api.themoviedb.org/3/discover/movie?sort_by=&api_key="; 


ArrayList<movie> movies = new ArrayList<>(); 
movieAdapter adapter; 
GridView gridview; 

DbOpenHelper dbHelper; 


public MainFragment() { 
    getDataFromDB(); 
} 


public MainFragment(String SortBy) { 
    new FetchDataFromApi(SortBy).execute(); 
} 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater,container,savedInstanceState); 
    View view = inflater.inflate(R.layout.fragment_main, container, false); 
    dbHelper = new DbOpenHelper(getActivity()); 
    gridview = (GridView) getActivity().findViewById(R.id.gridView); 
    return view; 
} 


class FetchDataFromApi extends AsyncTask<String, Void, Boolean> { 
    String SORT_CATEGORY; 

    FetchDataFromApi(String paramUrl) { 
     SORT_CATEGORY = paramUrl; 
    } 

    @Override 
    protected Boolean doInBackground(String... params) { 

     HttpURLConnection urlConnection = null; 

     try { 
      Uri uriBuilder = Uri.parse(BASE_URL).buildUpon() 
        .appendQueryParameter("sort_by", SORT_CATEGORY) 
        .appendQueryParameter("api_key", API_KEY) 
        .build(); 
      URL url = new URL(uriBuilder.toString()); 
      urlConnection = (HttpURLConnection) url.openConnection(); 

      InputStream in = urlConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); 
      StringBuilder sb = new StringBuilder(); 
      String line; 

      while ((line = bufferedReader.readLine()) != null) { 
       sb.append(line); 
      } 

      String response = sb.toString(); 
      ParseJsonData(response); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      urlConnection.disconnect(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     adapter = new movieAdapter(getActivity(), R.layout.movie_item, movies); 
     gridview.setAdapter(adapter); 
     gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       PassDataToDetailedActivity(position); 
      } 
     }); 
    } 


    private void ParseJsonData(String response) throws JSONException { 
     String PosterBaseUrl = "http://image.tmdb.org/t/p/"; 
     String LargePoster = "w185"; 
     String SmallPoster = ""; 
     final String RESULTS = "results"; 
     final String ORIGINAL_TITLE = "original_title"; 
     final String OVERVIEW = "overview"; 
     final String RELEASE_DATE = "release_date"; 
     final String POSTER_PATH = "poster_path"; 
     final String VOTE_AVERAGE = "vote_average"; 
     final String POPULARITY = "popularity"; 


     JSONObject jsono = new JSONObject(response); 
     Log.v("Json", response); 
     JSONArray jarray = jsono.getJSONArray(RESULTS); 

     for (int i = 0; i < jarray.length(); i++) { 
      JSONObject object = jarray.getJSONObject(i); 

      String title = object.getString(ORIGINAL_TITLE); 
      String releaseDate = object.getString(RELEASE_DATE); 
      String overView = object.getString(OVERVIEW); 
      String voteAverage = object.getString(VOTE_AVERAGE); 
      String popularity = object.getString(POPULARITY); 
      String posterPath = object.getString(POSTER_PATH); 

      String MaxPoster = PosterBaseUrl + LargePoster + posterPath; 
      String MinPoster = PosterBaseUrl + SmallPoster + posterPath; 

      movie m = new movie(); 
      m.setTitle(title); 
      m.setReleaseDate(releaseDate); 
      m.setOverView(overView); 
      m.setVoteAverage(voteAverage); 
      m.setPopularity(popularity); 
      m.setLargePoster(MaxPoster); 
      m.setMinPoster(MinPoster); 

      movies.add(m); 
     } 
    } 
} 

private void PassDataToDetailedActivity(int position) { 
    String title = movies.get(position).getTitle(); 
    String releaseDate = movies.get(position).getReleaseDate(); 
    String overView = movies.get(position).getOverView(); 
    String voteAverage = movies.get(position).getVoteAverage(); 
    String popularity = movies.get(position).getPopularity(); 
    String MaxPoster = movies.get(position).getLargePoster(); 
    String MinPoster = movies.get(position).getMinPoster(); 

    Intent intent = new Intent(getActivity(), DetailedActivity.class); 
    intent.putExtra("title", title); 
    intent.putExtra("releaseDate", releaseDate); 
    intent.putExtra("overView", overView); 
    intent.putExtra("voteAverage", voteAverage); 
    intent.putExtra("popularity", popularity); 
    intent.putExtra("", MaxPoster); 
    intent.putExtra("MinPoster", MinPoster); 
    startActivity(intent); 
} 

private void getDataFromDB() { 
    \\ the problem is here 
    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    String PosterUrl; 
    ArrayList<String> list= new ArrayList<>(); 


    Cursor cursor = db.rawQuery("select * from " + DbOpenHelper.TABLE_NAME ,null); 
    if (cursor .moveToFirst()) { 
    do{PosterUrl = cursor.getString(cursor 
        .getColumnIndex(DbOpenHelper.FeedEntry.KEY_LARGE_POSTER_URL)); 

      list.add(PosterUrl);} 

     while (cursor.isAfterLast() == false); { 

      cursor.moveToNext(); 
     } 
    } 
    cursor.close(); 
    db.close(); 

    for(int i = 0; i < list.size(); i++) { 
     Log.v("List",(list.get(i)).toString()); 
    } 

    Log.v("hello", "its working"); 

} 

}

Мои DbHelper Класс

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 

    /** 
    * Created by ahmed on 12/17/2015. 
    */ 
public class DbOpenHelper extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 

// Database Name 
public static final String DATABASE_NAME = "fav.db"; 

// Table name 
public static final String TABLE_NAME = "Data"; 

// Table Columns names 
private static final String KEY_ID = "id"; 


public static abstract class FeedEntry implements BaseColumns { 

    public static final String KEY_LARGE_POSTER_URL = "largePoster"; 
    public static final String KEY_MINI_POSTER_URL = "minPoster"; 
    public static final String KEY_MOVIE_NAME = "movieName"; 
    public static final String KEY_RELEASE_DATE = "releaseDate"; 
    public static final String KEY_VOTE_AVERAGE = "vote_average"; 
    public static final String KEY_OVERVIEW = "overview"; 

} 

public DbOpenHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_FAVORITES_TABLE = "CREATE TABLE " + TABLE_NAME + "(" 
      + KEY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," 
      + FeedEntry.KEY_LARGE_POSTER_URL + " TEXT," 
      + FeedEntry.KEY_MINI_POSTER_URL + " TEXT, " 
      + FeedEntry.KEY_MOVIE_NAME + " TEXT," 
      + FeedEntry.KEY_RELEASE_DATE+" TEXT," 
      + FeedEntry.KEY_OVERVIEW+" TEXT," 
      + FeedEntry.KEY_VOTE_AVERAGE+" TEXT," 
      + ")"; 
    db.execSQL(CREATE_FAVORITES_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(db); 
} 
} 

Мой журнал

12-18 01:44:36.915 12140-12140/? E/AndroidRuntime: FATAL EXCEPTION: main 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime: Process:   com.example.ahmed.popularmovies, PID: 12140 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ahmed.popularmovies/com.example.ahmed.popularmovies.MainActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class fragment 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2493) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.access$800(ActivityThread.java:176) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:111) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:194) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5576) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class fragment 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.example.ahmed.popularmovies.MainActivity.onCreate(MainActivity.java:19) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.Activity.performCreate(Activity.java:6005) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2446) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.access$800(ActivityThread.java:176)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:111)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:194)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5576)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.example.ahmed.popularmovies.data.DbOpenHelper.getReadableDatabase()' on a null object reference 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.example.ahmed.popularmovies.MainFragment.getDataFromDB(MainFragment.java:194) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.example.ahmed.popularmovies.MainFragment.<init>(MainFragment.java:49) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Constructor.newInstance(Native Method) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.Class.newInstance(Class.java:1572) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.Fragment.instantiate(Fragment.java:423) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.Fragment.instantiate(Fragment.java:398) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2275) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:314) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) 
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.view.LayoutInflater.inflate(LayoutInflater.java:365)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.example.ahmed.popularmovies.MainActivity.onCreate(MainActivity.java:19)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.Activity.performCreate(Activity.java:6005)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2446)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.access$800(ActivityThread.java:176)   
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:111)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:194)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5576)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)  
12-18 01:44:36.915 12140-12140/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)  

`

+0

'Вызванный: android.view.InflateException: Binary XML файл строка # 22: Ошибка при наполнении класса fragment' может быть ошибка в вашей деятельности –

+0

@vspallas эта ошибка показывает только, когда я добавить строку я комментировал в своем классе с «проблема здесь», если я удалю его, приложение не разбивается и работает хорошо, поэтому возникает проблема с получением базы данных из-за nullpointerExcepton –

+1

ok, тогда попробуйте не называть 'getDataFromDB();' на конструкторе, но на 'onCreateView' ниже' gridview'. –

ответ

0

В конструкторе фрагмента нулевого аргумента вы вызываете getDataFromDB(). Там вы звоните getReadableDatabase() по телефону dbHelper. Вы не инициализировали dbHelper, отчасти потому, что на данный момент у вас нет возможности сделать это. Следовательно, вы сбой с NullPointerException.

Во-первых, не реализуйте конструкторы на фрагментах. Я даже не рекомендую это для экспертов, не говоря уже о новых людях для Android и Java. Конструктор нулевого аргумента по умолчанию, который вы получите автоматически, будет достаточным для потребностей Android. Выполняйте всю свою работу в другом месте, руководствуясь методами жизненного цикла фрагмента (например, onCreate()).

Во-вторых, выполните ввод/вывод базы данных (или любой ввод-вывод) в фоновом потоке. Если бы вы следовали этому правилу, по крайней мере, вы бы не пытались делать ввод/вывод базы данных в методе, вызванном из конструктора, даже если вы проигнорировали мое первое правило.

Чтобы использовать SQLiteOpenHelper, вам необходимо создать экземпляр. Вы делаете это в onCreateView(), что хорошо. Однако это означает, что вы не можете попытаться использовать этот экземпляр SQLiteOpenHelper до тех пор, пока не будет вызван onCreateView() или, по крайней мере, до тех пор, пока эта строка кода не будет выполнена.

+0

Я сделал работу db в asynctask, которая сделала ее намного проще, поскольку она не блокирует ui, поэтому ошибка в MainActivity не показывает ,, Я буду см. о конструкторах позже, но теперь все проблемы - это NullPointerException –

+0

Есть две вещи, которые могут предотвратить эту ошибку, вы можете инициализировать dbHalper в конструкторе или вы можете вызвать getDataFromDB(); в вашем методе onCreateView. –