使用片段从数据库SQLite获取数据时出错

时间:2017-09-15 02:39:53

标签: android sqlite android-studio android-fragments

这是我的片段活动我在访问数据库时遇到错误我的代码是:

public class RainfallFragment extends Fragment {
public static final String KEY_DIVISION_ID="division_id";
public static final String KEY_DIVISION_NAME="division_name";
ListView listCollege;
ProgressBar proCollageList;
public Context context;
private MySQLiteHelper dbHelper;
public RainfallFragment() {}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    dbHelper = new MySQLiteHelper(getActivity());
   // dbHelper = new MySQLiteHelper(this);
    dbHelper.getReadableDatabase();

}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment


    getActivity().setTitle("Rainfall Report");
    getActivity().setTitleColor(0000000);
    View v =inflater.inflate(R.layout.fragment_rainfall, container, false);
    context = v.getContext();

    v.setFocusableInTouchMode(true);
    v.requestFocus();
    v.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    getActivity().finish();
                    Intent intent = new Intent(getActivity(), MainActivity.class);
                    startActivity(intent);

                    return true;
                }
            }
            return false;
        }
    });

    //DISINI BATAS NYA//


    listCollege = (ListView)v.findViewById(R.id.listCollege);
    proCollageList = (ProgressBar)v.findViewById(R.id.proCollageList);

    new GetHttpResponse().execute();

    listCollege.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
            // On selecting single row to get detail information
            final String division_id = ((TextView) view.findViewById(R.id.adapter_text_id)).getText().toString();
            final String division_name = ((TextView) view.findViewById(R.id.adapter_text_estate)).getText().toString();

            AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
            b.setIcon(android.R.drawable.ic_dialog_alert);
            b.setMessage("Sure for choosing this estate");
            b.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {

                    Intent i = new Intent(getActivity(), RainfallReport.class);
                    i.putExtra(KEY_DIVISION_ID, division_id);
                    i.putExtra(KEY_DIVISION_NAME, division_name);
                    getActivity().startActivity(i);
                    dialog.dismiss();
                }
            });

            b.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                }
            });
            b.show();
        }
    });
    return v;
}


private class GetHttpResponse extends AsyncTask<Void, Void, Void> {
    private Context context;
    String result;
    List<HashMap<String, String>> collegeList;



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

    @Override
    protected Void doInBackground(Void... arg0)
    {
        List<Estate> estates = new LinkedList<Estate>();
        estates= dbHelper.getAllEstate();

        //Syntax for sort Listview Array by Id Ascending
        Collections.sort(estates, new Comparator<Estate>(){
            @Override
            public int compare(Estate id1,Estate id2) {
                return id1.getDivision_id() - id2.getDivision_id();
            }
        });

        // looping through All data

        for(Estate temp_vg: estates){
            temp_vg.getDivision_id();
            temp_vg.getDivision_name();

            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            // adding each child node to HashMap key => value
            map.put("division_id", String.valueOf(temp_vg.getDivision_id()));
            map.put("division_estate", temp_vg.getDivision_name());

            // adding HashList to ArrayList
            collegeList.add(map);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result)

    {
        proCollageList.setVisibility(View.GONE);
        listCollege.setVisibility(View.VISIBLE);
        if(collegeList != null)
        {

            //adapter = new ListAdapterEstate(LihatDataEstate.this, map);
            ListAdapterEstate adapter = new ListAdapterEstate(collegeList, context);
            listCollege.setAdapter(adapter);

            //adapter=new LazyAdapter(Lihat_Data.this, dataList);
            //list.setAdapter(adapter);

        }
    }
}

MySQLiteHelper.java

  public class MySQLiteHelper extends SQLiteOpenHelper {



    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "AARIDB.db";
    private SQLiteDatabase database;
    public MySQLiteHelper(Context context) {
        super(context, "/mnt/sdcard/AARIDB/DBAARI.db", null, DATABASE_VERSION);
        //super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
          String RAINFALL_TABLE = "CREATE TABLE rainfall ( " +
                "division_id INTEGER PRIMARY KEY, " +
                "year_rainfall VARCHAR (5), "+
                "jan VARCHAR (10), "+
                "feb VARCHAR (10),"+
                "mar VARCHAR (10),"+
                "apr VARCHAR (10),"+
                "may VARCHAR (10),"+
                "jun VARCHAR (10),"+
                "jul VARCHAR (10),"+
                "aug VARCHAR (10),"+
                "sep VARCHAR (10),"+
                "oct VARCHAR (10),"+
                "nov VARCHAR (10),"+
                "dec VARCHAR (10),"+
                " FOREIGN KEY division_id REFERENCES "+ESTATE_TABLE+"division_id;";
        // create table
        db.execSQL(RAINFALL_TABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older books table if existed

        db.execSQL("DROP TABLE IF EXISTS rainfall");

        // create fresh books table
        this.onCreate(db);
    }

    //---------------------------------------------------------------------

    /**
     * CRUD operations (create "add", read "get", update, delete) book + get all  + delete all
     */


    private static final String TABLE_RAINFALL = "rainfall";
    // assesment Table Columns names
    public static final String KEY_DIVISION_ID_RAINFALL= "division_id";
    public static final String KEY_YEAR_RAINFALL= "year_rainfall";
    public static final String KEY_JAN_RAINFALL = "jan";
    public static final String KEY_FEB_RAINFALL = "feb";
    public static final String KEY_MAR_RAINFALL = "mar";
    public static final String KEY_APR_RAINFALL = "apr";
    public static final String KEY_MAY_RAINFALL = "may";
    public static final String KEY_JUN_RAINFALL = "jun";
    public static final String KEY_JUL_RAINFALL = "jul";
    public static final String KEY_AUG_RAINFALL = "aug";
    public static final String KEY_SEP_RAINFALL = "sep";
    public static final String KEY_OCT_RAINFALL = "oct";
    public static final String KEY_NOV_RAINFALL = "nov";
    public static final String KEY_DEC_RAINFALL = "dec";



    private static final String[] COLUMN_RAINFALL = {
            KEY_DIVISION_ID_RAINFALL,
            KEY_YEAR_RAINFALL,
            KEY_JAN_RAINFALL,
            KEY_FEB_RAINFALL ,
            KEY_MAR_RAINFALL ,
            KEY_APR_RAINFALL,
            KEY_MAY_RAINFALL,
            KEY_JUN_RAINFALL,
            KEY_JUL_RAINFALL,
            KEY_AUG_RAINFALL,
            KEY_SEP_RAINFALL,
            KEY_OCT_RAINFALL ,
            KEY_NOV_RAINFALL ,
            KEY_DEC_RAINFALL};


    public void addRAINFALL(Rainfall rainfall){
        Log.d("addRAINFALL", rainfall.toString());
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(KEY_DIVISION_ID_RAINFALL, rainfall.getDivision_id()); // get est
        values.put(KEY_YEAR_RAINFALL, rainfall.getYear_rainfall());
        values.put(KEY_JAN_RAINFALL , rainfall.getJan());
        values.put(KEY_FEB_RAINFALL, rainfall.getFeb());
        values.put(KEY_MAR_RAINFALL, rainfall.getMar()); // get estate name
        values.put(KEY_APR_RAINFALL, rainfall.getApr());
        values.put(KEY_MAY_RAINFALL, rainfall.getMay());
        values.put(KEY_JUN_RAINFALL, rainfall.getJun());
        values.put(KEY_JUL_RAINFALL, rainfall.getJul()); // get estate name
        values.put(KEY_AUG_RAINFALL, rainfall.getAug());
        values.put(KEY_SEP_RAINFALL, rainfall.getSep());
        values.put(KEY_OCT_RAINFALL , rainfall.getOct()); // get estate name
        values.put(KEY_NOV_RAINFALL,rainfall.getNov());
        values.put(KEY_DEC_RAINFALL, rainfall.getDec());
        // 3. insert
        db.insert(TABLE_RAINFALL, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values
        // 4. close
        db.close();
    }


    public List<Rainfall> getAllRainfall() {
        List<Rainfall> rainfall = new LinkedList<Rainfall>();
        // 1. build the query
        String query = "SELECT  * FROM " + TABLE_RAINFALL+" ORDER BY "+KEY_DIVISION_ID_RAINFALL;
        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        // 3. go over each row, build book and add it to list
        Rainfall rainfall1 = null;
        if (cursor.moveToFirst()) {
            do {
                rainfall1 = new Rainfall();
                rainfall1.setDivision_id(Integer.parseInt(cursor.getString(0)));
                rainfall1.setYear_rainfall(cursor.getString(1));
                rainfall1.setJan(cursor.getString(2));
                rainfall1.setFeb(cursor.getString(3));
                rainfall1.setMar(cursor.getString(4));
                rainfall1.setApr(cursor.getString(5));
                rainfall1.setMay(cursor.getString(6));
                rainfall1.setJun(cursor.getString(7));
                rainfall1.setJul(cursor.getString(8));
                rainfall1.setAug(cursor.getString(9));
                rainfall1.setSep(cursor.getString(10));
                rainfall1.setOct(cursor.getString(11));
                rainfall1.setNov(cursor.getString(12));
                rainfall1.setDec(cursor.getString(13));
                // Add vgm
                rainfall.add(rainfall1);
            } while (cursor.moveToNext());
        }
        return rainfall;
    }




    public Cursor getAllDataRainfall() {
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor mCursor = db.query("SELECT year_rainfall, jan, feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec FROM rainfall",
                new String[] {KEY_YEAR_RAINFALL,KEY_JAN_RAINFALL,KEY_FEB_RAINFALL,KEY_MAR_RAINFALL,KEY_APR_RAINFALL,KEY_MAY_RAINFALL,
                KEY_JUN_RAINFALL,KEY_JUL_RAINFALL,KEY_AUG_RAINFALL,KEY_SEP_RAINFALL,KEY_OCT_RAINFALL,KEY_NOV_RAINFALL,KEY_DEC_RAINFALL},
                null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        db.close();
        return mCursor;
    }

我只需要片段访问数据库。任何人都会帮助我,我会很感激。错误的log cat低于。

请注意! at com.test.myapplication.RainfallFragment.onCreate(RainfallFragment.java:40)是指dbHelper.getReadableDatabase();

09-14 22:20:16.387 1247-1247/com.test.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.test.myapplication, PID: 1247
                                                                      java.lang.NullPointerException
                                                                          at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
                                                                          at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
                                                                          at com.test.myapplication.RainfallFragment.onCreate(RainfallFragment.java:40)
                                                                          at android.support.v4.app.Fragment.performCreate(Fragment.java:2068)
                                                                          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1055)
                                                                          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
                                                                          at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                                                                          at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
                                                                          at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
                                                                          at android.os.Handler.handleCallback(Handler.java:733)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:136)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5001)
                                                                          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:785)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                          at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:0)

我无法设置你的MySQLiteHelper的onCreate。你需要把

String RAINFALL_TABLE = "CREATE TABLE rainfall ( " +
            "division_id INTEGER PRIMARY KEY, " +
            "year_rainfall VARCHAR (5), "+
            "jan VARCHAR (10), "+
            "feb VARCHAR (10),"+
            "mar VARCHAR (10),"+
            "apr VARCHAR (10),"+
            "may VARCHAR (10),"+
            "jun VARCHAR (10),"+
            "jul VARCHAR (10),"+
            "aug VARCHAR (10),"+
            "sep VARCHAR (10),"+
            "oct VARCHAR (10),"+
            "nov VARCHAR (10),"+
            "dec VARCHAR (10),"+
            " FOREIGN KEY division_id REFERENCES "+ESTATE_TABLE+"division_id;";
    // create table
    db.execSQL(RAINFALL_TABLE);

在你的MySQLiteHelper的onCreate中创建像这样的表

@Override
public void onCreate(SQLiteDatabase db) {
    String RAINFALL_TABLE = "CREATE TABLE rainfall ( " +
            "division_id INTEGER PRIMARY KEY, " +
            "year_rainfall VARCHAR (5), "+
            "jan VARCHAR (10), "+
            "feb VARCHAR (10),"+
            "mar VARCHAR (10),"+
            "apr VARCHAR (10),"+
            "may VARCHAR (10),"+
            "jun VARCHAR (10),"+
            "jul VARCHAR (10),"+
            "aug VARCHAR (10),"+
            "sep VARCHAR (10),"+
            "oct VARCHAR (10),"+
            "nov VARCHAR (10),"+
            "dec VARCHAR (10),"+
            " FOREIGN KEY division_id REFERENCES "+ESTATE_TABLE+"division_id;";
    // create table
    db.execSQL(RAINFALL_TABLE);         

}

答案 1 :(得分:0)

我已经解决了这个问题.. 只需在RainfallFragment中更改我的代码

从:

List<HashMap<String, String>> collegeList;

为:

ArrayList<HashMap<String, String>> collegeList = new ArrayList<HashMap<String, String>>();

进入我的Asynctask RainfallFargment。

答案 2 :(得分:-1)

MySQLiteHelper

中进行更改
public class MySQLiteHelper {
    private SQLiteDatabase db;
    private Context context;
    private DBHelper dbHelper;

    public MySQLiteHelper(Context context) {
            dbHelper = new DBHelper(context);

        }

    public MySQLiteHelper open() throws SQLException {
            db = dbHelper.getWritableDatabase();
            return this;
        }

    public void close() {
            dbHelper.close();
       }    

    public class DBHelper extends SQLiteOpenHelper {

            public DBHelper(Context context) {
                super(context, "/mnt/sdcard/AARIDB/DBAARI.db", null, 1);
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
                db.execSQL(RAINFALL_TABLE);//create tables
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                db.execSQL("DROP TABLE IF EXISTS rainfall"); //drop tables if exists and than create or alter
                this.onCreate(db);
            }
        }
}

从其他activity拨打电话:

MySQLiteHelper db = new MySQLiteHelper(MainActivity.this);