Android 尝试在空对象引用上调用虚拟方法



这是我从 getbeat 方法调用 getquery 结果的代码,但我总是收到错误,因为"尝试在空对象引用上调用虚拟方法'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])'

public class report extends Fragment {
    private ImageButton BtnImgCal;
    private Spinner spinbt;
    private Spinner spindr;
    private Calendar cal;
    private FragmentActivity myContext;
    Button btnsun;
    int day;
    int month;
    int year;
    private EditText et;
    static final int DATE_PICKER_ID = 1111;
    private int Year;
    private int Month ;
    private int  Day ;
    String[] MonthNames = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    GetLocation loc;
    double lati,longi;
    DBAdapter db;
    String[] beat;
    String[] Beat;
    public report(){}
                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
                { 
                     String[] strtext = getArguments().getStringArray("beatarray"); 
                     beat=strtext.clone();
                    View rootView = inflater.inflate(R.layout.call_report, container, false);         
                    return rootView;
                }
                 @Override
                 public void onViewCreated(final View view,Bundle savedInstanceState) 
                 {
                        super.onViewCreated(view, savedInstanceState);
                      db=new DBAdapter(getActivity());
                       GetBeat();
                  }
                        BtnImgCal = (ImageButton) getActivity().findViewById(R.id.ImgCalBtn);
                        cal = Calendar.getInstance();
                        day = cal.get(Calendar.DAY_OF_MONTH);
                        month = cal.get(Calendar.MONTH);
                        year = cal.get(Calendar.YEAR);
                        et = (EditText) getActivity().findViewById(R.id.etdate);
                        et.setText(day+"-"+ MonthNames[month] +"-"+year);
                        spinbt=(Spinner) this.getActivity().findViewById(R.id.spinBeat);
                        spinbt.setPrompt("Select Beat");
                    btnsun = (Button)this.getActivity().findViewById(R.id.btn_submit);              

                        final ToggleButton toggleButton = (ToggleButton) getActivity().findViewById(R.id.tglbtn);
                        toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() 

                        BtnImgCal.setOnClickListener(new View.OnClickListener() 
                        {
                            @Override
                            public void onClick(View view) 
                            {
                                //Toast.makeText(getActivity(),"Daily Call Summary",Toast.LENGTH_SHORT).show();
                                DialogFragment newFragment = new SelectDateFragment();
                                newFragment.show(getFragmentManager(), "DatePicker");
                            }
                        });
                 }
                 private void GetBeat() {
                        Cursor gb=db.getQueryResult("Select beatid,beat_name from beat_mas");
                        if(gb.getCount()>0)
                        {
                         Beat = new String[gb.getCount()+1]; 
                           int i=0; 
                           Beat[0]="Select Beat";
                        if (gb.moveToFirst())
                         {

                               if (gb.moveToFirst())                
                               {                
                                     do 
                                     { 
                                         Beat[i+1] =gb.getString(1) + " :ID-" + gb.getInt(0);  //Town Id
                                          i+=1; 
                                     } while (gb.moveToNext());                                                                   
                               }            
                               gb.close();   //close db      
                         }
            }
    }

我的DBAdapter是

public class DBAdapter 
{   
    public static final String KEY_ROWID = "_id";   //Table Fields ....
    private static final String TAG = "DBAdapter";    
    private static final String DATABASE_NAME = "bioderma";   //Database Name
    private static final int DATABASE_VERSION =41;
    public static String DateTime = null;

    private static final String DATABASE_CREATE_app_req =
        "create table app_req (_id integer primary key autoincrement, "
        + "req_no integer not null);";  
    //Login Master
    private static final String DATABASE_CREATE_login_mas =
            "create table login_mas (_id integer primary key autoincrement, userid integer not null, name text not null, "
            + "login_id text not null, password text not null, auth_key text not null, login_flag integer not null, "
            + "port_day integer null , port_month  integer null, port_year integer  null, " 
            + "user_type integer not null,sms_mode integer not null,dc_type integer not null);";
  //Beat Master
    private static final String DATABASE_CREATE_beat_mas =
            "create table beat_mas (_id integer primary key autoincrement, beatid integer not null,  "
            + "beat_name text not null);";
    //import log
    private static final String DATABASE_CREATE_import_log =            
            "create table import_log (_id integer primary key autoincrement, "
            + "port_flag integer not null);";  


    private final Context context; 
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;
    public DBAdapter(Context ctx)
    {
        this.context = ctx;
        System.out.println("this.context>>>>>>>>>>>>>>>>>"+ this.context);
        DBHelper = new DatabaseHelper(context);
    }
    private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            db.execSQL(DATABASE_CREATE_app_req);
            db.execSQL(DATABASE_CREATE_login_mas);
            db.execSQL(DATABASE_CREATE_beat_mas);
            db.execSQL(DATABASE_CREATE_import_log);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
        int newVersion) 
        {               
           Log.w(TAG, "Upgrading database from version " + oldVersion 
                    + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS app_req");
            db.execSQL("DROP TABLE IF EXISTS login_mas");   
            db.execSQL("DROP TABLE IF EXISTS beat_mas");
            db.execSQL("DROP TABLE IF EXISTS import_log");
            onCreate(db);           
        }
    } 
   //-------------------------- Insert ------------------------------------------------------------------------------

    public long insertBeat(int beatid, String beat_name)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put("beatid", beatid);
        initialValues.put("beat_name", beat_name);
        return db.insert("beat_mas", null, initialValues);  
    }
    public long insertimport(int imp_log) 
    {                   
        ContentValues initialValues = new ContentValues();
        initialValues.put("port_flag", imp_log);
        return db.insert("import_log", null, initialValues);    
    }

   //-------------------------- Insert Ends Here------------------------------------------------------------------------------

   //-------------------------- Update ------------------------------------------------------------------------------


    //executing query and it returns fields which are specified in the query ..........
    public Cursor getQueryResult(String MY_QUERY) throws SQLException 
    {  
        try {
            return db.rawQuery(MY_QUERY, null);    
        } catch (Exception e) {
            System.out.println("getQueryResult error>>>>>>>>>>>>> :" + e.toString());
        }
        return null;       
    }
}

我只有在处理片段时才会遇到这个问题......

注意。。。我在我的应用程序中使用Hamburger_menu....我有片段 A,B,C,D所有片段都是 MainActivity 的子片段。在主活动中,我可以执行 sqlite 操作,但在片段中我收到错误为"尝试在空对象引用上调用虚拟方法'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])'

"

这是我的日志

02-03 12:56:43.482: I/art(17996): Debugger is active
02-03 12:56:43.672: I/System.out(17996): Debugger has connected
02-03 12:56:43.672: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:43.872: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:44.073: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:44.276: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:44.476: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:44.676: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:44.876: I/System.out(17996): waiting for debugger to settle...
02-03 12:56:45.077: I/System.out(17996): debugger has settled (1462)
02-03 12:56:45.123: V/Monotype(17996): SetAppTypeFace- try to flip, app = com.example.bioderma
02-03 12:56:45.131: V/Monotype(17996):     Typeface getFontPathFlipFont - systemFont = default#default
02-03 12:56:45.149: I/System.out(17996): this.context>>>>>>>>>>>>>>>>>com.example.bioderma.Login@3d712f6f
02-03 12:56:45.160: V/Monotype(17996): SetAppTypeFace- try to flip, app = com.example.bioderma
02-03 12:56:45.160: V/Monotype(17996):     Typeface getFontPathFlipFont - systemFont = default#default
02-03 12:56:48.119: I/System.out(17996): intent>>>>>>>>Intent { cmp=com.example.bioderma/.MainActivity }
02-03 12:56:48.140: I/System.out(17996): this.context>>>>>>>>>>>>>>>>>com.example.bioderma.MainActivity@181d2119
02-03 12:56:48.143: V/Monotype(17996): SetAppTypeFace- try to flip, app = com.example.bioderma
02-03 12:56:48.143: V/Monotype(17996):     Typeface getFontPathFlipFont - systemFont = default#default
02-03 12:56:48.876: I/System.out(17996): activity>>>>>>>>>>>>>>>>>android.app.Application@1a9dd12a
02-03 12:56:49.392: D/Network(17996): Network
02-03 12:56:49.392: I/System.out(17996): this.context>>>>>>>>>>>>>>>>>com.example.bioderma.MainActivity@181d2119
02-03 12:56:49.759: I/System.out(17996): getQueryResult error>>>>>>>>>>>>> :java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
02-03 12:56:55.398: D/AndroidRuntime(17996): Shutting down VM
02-03 12:56:55.402: E/AndroidRuntime(17996): FATAL EXCEPTION: main
02-03 12:56:55.402: E/AndroidRuntime(17996): Process: com.example.bioderma, PID: 17996
02-03 12:56:55.402: E/AndroidRuntime(17996): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bioderma/com.example.bioderma.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread.access$800(ActivityThread.java:147)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.os.Looper.loop(Looper.java:135)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread.main(ActivityThread.java:5253)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at java.lang.reflect.Method.invoke(Native Method)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at java.lang.reflect.Method.invoke(Method.java:372)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
02-03 12:56:55.402: E/AndroidRuntime(17996): Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference
02-03 12:56:55.402: E/AndroidRuntime(17996):    at com.example.bioderma.report.GetBeat(report.java:171)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at com.example.bioderma.report.onViewCreated(report.java:71)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.BackStackRecord.run(BackStackRecord.java:833)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.Activity.performStart(Activity.java:5990)
02-03 12:56:55.402: E/AndroidRuntime(17996):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2279)
02-03 12:56:55.402: E/AndroidRuntime(17996):    ... 10 more
02-03 12:56:57.830: I/Process(17996): Sending signal. PID: 17996 SIG: 9

请查看以下教程,这可能会对您有所帮助。

http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

此外,在类内执行查询时db初始化变量DatabaseHelper

db = this.getWritableDatabase();

相关内容

  • 没有找到相关文章

最新更新