NullPointerException与使用数据库的片段

时间:2014-10-11 19:14:57

标签: android android-fragments nullpointerexception

我有一个使用数据库的片段类(SQLiteOpenHelper)和3个不同的标签,包含3个不同的片段。现在,当我想在启动应用程序时在我的片段中使用我的数据库时,我得到一个NullPointerException。谁能告诉我为什么会这样?

我的TabsPageAdapter的代码:

public class TabsPagerAdapter extends FragmentPagerAdapter {
List<MyFragment> myTabs = new ArrayList<MyFragment>();

public TabsPagerAdapter(FragmentManager fm){
    super(fm);
    myTabs.add(new AllShowsFragment());
    myTabs.add(new UnwatchedShowsFragment());
    myTabs.add(new WatchedShowsFragment());
}

@Override
public Fragment getItem(int index){
    switch(index) {
        case 0:
            return myTabs.get(0);
        case 1:
            return myTabs.get(1);
        case 2:
            return myTabs.get(2);
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}
}

我主要活动中最重要的部分:

public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {

public static boolean simple_progress;
public static int editmode;
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
private DatabaseHandler db;
private Show current_show;
private int current_tab = 0;

private String[] tabs = { "All Shows", "Unwatched", "Watched" };

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

    db = new DatabaseHandler(this);
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    for (String tab_name : tabs){
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    viewPager.setCurrentItem(tab.getPosition());
    current_tab = tab.getPosition();
    update();
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

public void update(){
    mAdapter.myTabs.get(current_tab).update();
}
}

我获得NullPointerException的片段类的大部分代码:

public class AllShowsFragment extends MyFragment {
private SQLiteDatabase newDB;
private ListView lv;
private List<Show> showList = new ArrayList<Show>();
private int position;
private DatabaseHandler db;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_shows, container, false);
    lv = (ListView) rootView.findViewById(R.id.mainlist);
    lv.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                       int pos, long id) {
            position = pos;
            createClickMenu();
            return true;
        }
    });
    return rootView;
}

public void update(){
    populateListfromDB();
}

public void populateListfromDB() {
    db = new DatabaseHandler(getActivity()); 
    newDB = db.getWritableDatabase(); // here I am getting the NullPointerException
    showList.clear();

    Cursor cursor = newDB.rawQuery("SELECT id as _id, title, cseason, cepisode, watched FROM "
            + db.TABLE_SHOWS, null);

    cursor.moveToFirst();

    if (cursor != null & cursor.moveToFirst()) {
        cursor.moveToFirst();
        do {
            Show show = new Show(Integer.parseInt(cursor.getString(0)), cursor.getString(1),
                    cursor.getString(2), cursor.getString(3),
                    Integer.parseInt(cursor.getString(4)));
            showList.add(show);
        } while (cursor.moveToNext());
    }

    myCursorAdapter = new CustomAdapter(this, showList,((MainActivity)this.getActivity()).editmode,
            ((MainActivity)this.getActivity()).simple_progress);
    lv.setAdapter(myCursorAdapter);
}
}

DatabaseHandler的第一部分代码:

public class DatabaseHandler extends SQLiteOpenHelper{
public DatabaseHandler(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
};

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "showManager";
public static final String TABLE_SHOWS = "shows";

public static final String KEY_ID = "id";
public static final String KEY_TITLE = "title";
public static final String KEY_CURRENT_SEASON = "cseason";
public static final String KEY_CURRENT_EPISODE = "cepisode";
public static final String KEY_WATCHED = "watched";

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_SHOWS_TABLE = "CREATE TABLE " + TABLE_SHOWS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT,"
            + KEY_CURRENT_SEASON + " TEXT," + KEY_CURRENT_EPISODE +
            " TEXT," + KEY_WATCHED + " INTEGER" + ")";
    db.execSQL(CREATE_SHOWS_TABLE);
}

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

堆栈跟踪:

java.lang.NullPointerException
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
        at wrodarczyk.com.showtracker.AllShowsFragment.populateListfromDB(AllShowsFragment.java:55)
        at wrodarczyk.com.showtracker.AllShowsFragment.update(AllShowsFragment.java:50)
        at wrodarczyk.com.showtracker.MainActivity.update(MainActivity.java:173)
        at wrodarczyk.com.showtracker.MainActivity.onTabSelected(MainActivity.java:124)
        at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:577)
        at com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:506)
        at com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:492)
        at wrodarczyk.com.showtracker.MainActivity.onCreate(MainActivity.java:51)
        at android.app.Activity.performCreate(Activity.java:5312)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2552)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2653)
            at android.app.ActivityThread.access$800(ActivityThread.java:156)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5872)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
            at dalvik.system.NativeStart.main(Native Method)

0 个答案:

没有答案