我正试图在图表中显示我的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)
你能帮我弄清楚我在这里缺少什么吗?几个星期以来,我一直坚持这个问题。任何帮助表示赞赏。感谢。
答案 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;