Achartengine显示来自数据库Android的数据

时间:2012-11-17 06:38:26

标签: android sqlite achartengine

我正试图在图表中显示我的BMI结果。数据来自数据库。这是我到目前为止所尝试的内容:

private static class DBHelper extends SQLiteOpenHelper{

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL( "CREATE TABLE " + DATABASE_TABLE + " (" +
        KEY_BMIID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_BMIDATA + " TEXT NOT NULL, " +
                KEY_BMIDATE + " TEXT NOT NULL );"
                );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL( "DROP TABLE IF EXISTS " + DATABASE_TABLE );
        onCreate(db);
    }

}

public BMICalculatorDB(Context c){
    ourContext = c;
}

public BMICalculatorDB open(){
    ourHelper = new DBHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

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

public long createEntry( String data, String date ) {
    //, String date 
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_BMIDATA, data);
    cv.put(KEY_BMIDATE, date);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

public String getBMIID() {
    // TODO Auto-generated method stub
    String[] column =
            new String[]{ KEY_BMIID };
    Cursor c = 
            ourDatabase.query(DATABASE_TABLE, column, null, null, null, null, null);

    String result = "";
    int iID = c.getColumnIndex(KEY_BMIID);

    for ( c.moveToFirst(); ! c.isAfterLast(); c.moveToNext() ){
        result = result + c.getString(iID);
    }

    return result;
}

public String getBMIDataData(){

    String[] column =
                new String[]{ KEY_BMIDATA };
        Cursor c = 
                ourDatabase.query( DATABASE_TABLE, column, null, null, null, null, null );

        String result = "";
        int iData = c.getColumnIndex( KEY_BMIDATA );

        for ( c.moveToFirst(); ! c.isAfterLast(); c.moveToNext() ){
            result = result + c.getString( iData );
        }


    return result;
}

public String getBMIDateData(){
    String[] column =
            new String[]{ KEY_BMIDATE };
    Cursor c = 
            ourDatabase.query( DATABASE_TABLE, column, null, null, null, null, null );

    String result = "";
    int iDate = c.getColumnIndex( KEY_BMIDATE);

    for ( c.moveToFirst(); ! c.isAfterLast(); c.moveToNext() ){
        result = result + c.getString( iDate );
    }


return result;
}

public void updateEntry( long lId, String mData, String mDate ) {
    // TODO Auto-generated method stub
    ContentValues cvUpdate = new ContentValues();

    cvUpdate.put( KEY_BMIDATA, mData );
    cvUpdate.put( KEY_BMIDATE, mDate );
    ourDatabase.update( DATABASE_TABLE, cvUpdate, KEY_BMIID + " = lId", null );
}

public String getData(long l) {
    // TODO Auto-generated method stub
    return null;
}

public String getDate(long l) {
    // TODO Auto-generated method stub
    return null;
}

public XYMultipleSeriesDataset getDemoDataset(String title) {

    String[] column =
            new String[]{ KEY_BMIDATA };
    Cursor c = ourHelper.getWritableDatabase().query( DATABASE_TABLE, column, null, null, null, null, null );

    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

    TimeSeries series = new TimeSeries("Line1");
    TimeSeries series2 = new TimeSeries(title);

    getBMIDataData();

    while (!c.isAfterLast()) {
        int date = c.getInt((Integer) c.getColumnIndexOrThrow("bmi_date"));
        int weight = c.getInt((Integer) c.getColumnIndexOrThrow("bmi_data"));
        series2.add(weight, date);
        c.moveToNext();
    }

    c.close();

    dataset.addSeries(series);
    dataset.addSeries(series2);

    return dataset;
}


public Intent getIntent(Context context) {

    //Lager TimeSeries for den første linja
    XYMultipleSeriesDataset dataset = getDemoDataset("Line1");

    //Kode for render
    XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

    //Optimalisering linje1
    XYSeriesRenderer renderer = new XYSeriesRenderer();
    renderer.setColor(Color.YELLOW);
    renderer.setPointStyle(PointStyle.CIRCLE);
    renderer.setFillPoints(true);

    // Optimalisering linje2 husk rekke følgen
    XYSeriesRenderer renderer2 = new XYSeriesRenderer();
    renderer2.setColor(Color.BLUE);
    renderer2.setPointStyle(PointStyle.SQUARE);
    renderer2.setFillPoints(true);

    //Legger til render seriene
    mRenderer.addSeriesRenderer(renderer);

    //Optimalisering grafen
    mRenderer.setChartTitle("Test");
    mRenderer.setZoomEnabled(true);
    mRenderer.setZoomButtonsVisible(true);
    mRenderer.setBackgroundColor(Color.BLACK);
    mRenderer.setApplyBackgroundColor(true);
    mRenderer.setXTitle("Dager");
    mRenderer.setShowGrid(true);

    mRenderer.addSeriesRenderer(renderer2);


    Intent intent = ChartFactory.getLineChartIntent(context, dataset, 
            mRenderer, "Line Graph Title");

    return intent;

}

我遇到了错误:

        Cursor c = ourHelper.getWritableDatabase().query( DATABASE_TABLE, column, null, null, null, null, null );

        XYMultipleSeriesDataset dataset = getDemoDataset("Line1");

logcat的:

11-17 14:35:36.823: E/AndroidRuntime(334): FATAL EXCEPTION: main
11-17 14:35:36.823: E/AndroidRuntime(334): java.lang.NullPointerException
11-17 14:35:36.823: E/AndroidRuntime(334):  at com.fps.iHealthFirst.calculators.BMICalculatorDB.getDemoDataset(BMICalculatorDB.java:155)
11-17 14:35:36.823: E/AndroidRuntime(334):  at com.fps.iHealthFirst.calculators.BMICalculatorDB.getIntent(BMICalculatorDB.java:183)
11-17 14:35:36.823: E/AndroidRuntime(334):  at com.fps.iHealthFirst.calculators.BMICalculator.onClick(BMICalculator.java:161)

我的活动课程:

public class BMICalculator extends Activity implements OnClickListener{

Button calculate, cancel, view;
EditText etweight, etheightin, etanswer, etheightft, etage;
TextView tvbmi;
RadioGroup gender;
RadioButton male, female;
Date dt = new Date();

public final String TABLE_NAME = "tbl_bmi";
public final String COLUMN_NAME = "bmi_data";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_LEFT_ICON);
    setContentView(R.layout.bmi);
    getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.calculator32);

    // call for components
    initControls();     

} // end onCreate method

private void initControls(){

    calculate = (Button) findViewById (R.id.btBMICalculate);
    cancel = (Button) findViewById (R.id.btBMICancel);
    calculate.setOnClickListener(this);
    cancel.setOnClickListener(this);
    etweight = (EditText) findViewById (R.id.etBMIweight);
    etheightin = (EditText) findViewById (R.id.etBMIheightIn);
    etheightft = (EditText) findViewById (R.id.etBMIheightft);
    etanswer = (EditText) findViewById (R.id.etBMI);    
    etage = (EditText) findViewById (R.id.etBMIAge);
    tvbmi = (TextView) findViewById (R.id.tvBMI);
    tvbmi.setOnClickListener(this);
    male = (RadioButton) findViewById (R.id.rbMale);
    female = (RadioButton) findViewById (R.id.rbFemale);
    view = (Button) findViewById (R.id.btnViewMe);
    view.setOnClickListener(this);

}

private void viewErrorToast(){

     LayoutInflater inflater = getLayoutInflater();
     View layout = inflater.inflate(R.layout.alert_toast,
        (ViewGroup) findViewById(R.id.llToast));
     ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
     image.setImageResource(R.drawable.alert32);
     TextView title = (TextView) layout.findViewById(R.id.tvTitleToast);
     title.setText("Attention");
     TextView text = (TextView) layout.findViewById(R.id.tvTextToast);
     text.setText("You have blank field/s!");
     Toast toast = new Toast(getApplicationContext());
     toast.setGravity(Gravity.CENTER | Gravity.CENTER, 12, 40);
     toast.setDuration(Toast.LENGTH_SHORT);
     toast.setView(layout);
     toast.show();

} // end of viewErrorToast method


private void viewBMISavedToast(){

    boolean didItWork = true;

    try{
    String data = etanswer.getText().toString();
    String date = new SimpleDateFormat( "yyyy-MM-dd" ).format( dt );

    BMICalculatorDB entry = new BMICalculatorDB( BMICalculator.this );
    entry.open();

    entry.createEntry(data, date);

    entry.close();
    }
    catch(Exception e){
        didItWork = false;
        viewErrorToast();
    }finally{
        if (didItWork){

            AlertDialog.Builder builder = new AlertDialog.Builder( this );
            builder.setTitle( "Successful" )
            .setIcon( R.drawable.ic_launcher )
            .setMessage( "You're result is saved in the database!" )
            .setPositiveButton( "OK", new DialogInterface.OnClickListener() {           
                public void onClick( DialogInterface dialog, int which ) {

                    dialog.dismiss();
                }
            });       
         AlertDialog ad = builder.create();
         ad.show();  

        }

    }


}


public void onClick(View v) {
    // TODO Auto-generated method stub

    switch(v.getId()){
    case R.id.btBMICalculate:
        if (male.isChecked()){
            calculateMen();
        }
        else if (female.isChecked()){
            calculateWomen();
        } // end if else
        break;
    case R.id.btBMICancel:
        clearAll();
        break;
    case R.id.tvBMI:
        displayDialog();
        break;
    case R.id.btnViewMe:
        //Intent i = new Intent( BMICalculator.this, ViewBMIData.class );
        //startActivity(i);
        BMICalculatorDB view = new BMICalculatorDB( null );
        Intent viewIntent = view.getIntent( this );
        startActivity( viewIntent );
        break;
    } // end switch

} // end onClick method

我遇到了新的logcat错误:

11-17 15:13:34.580: E/AndroidRuntime(360): FATAL EXCEPTION: main
11-17 15:13:34.580: E/AndroidRuntime(360): java.lang.IllegalArgumentException: column 'bmi_date' does not exist
11-17 15:13:34.580: E/AndroidRuntime(360):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
11-17 15:13:34.580: E/AndroidRuntime(360):  at com.fps.iHealthFirst.calculators.BMICalculatorDB.getDemoDataset(BMICalculatorDB.java:165)
11-17 15:13:34.580: E/AndroidRuntime(360):  at com.fps.iHealthFirst.calculators.BMICalculatorDB.getIntent(BMICalculatorDB.java:183)
11-17 15:13:34.580: E/AndroidRuntime(360):  at com.fps.iHealthFirst.calculators.BMICalculator.onClick(BMICalculator.java:162)
11-17 15:13:34.580: E/AndroidRuntime(360):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

你能帮我弄清楚我在这里缺少什么吗?几个星期以来,我一直坚持这个问题。任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

你从未像你的入门方法那样为你的意图方法打开数据库。在你的按钮开关语句中:

case R.id.btnViewMe:
        BMICalculatorDB view = new BMICalculatorDB( BMICalculator.this );
        view.open(); //<-- missing this line!!!
        Intent viewIntent = view.getIntent( BMICalculator.this ); // <-- make sure this context is approriate
        startActivity( viewIntent );
        view.close();
        break;