我正在制作一个简单的锻炼日历安卓应用程序。我想查询我的数据库中的某些日期并显示这些行。我只是通过查看教程来学习如何使用数据库,但我现在似乎陷入困境。任何帮助,将不胜感激。这是我试过的查询的代码。
Workout getWorkout(String date){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_WORKOUT, new String[] {KEY_DATE, KEY_WORKOUT, KEY_REPS, KEY_WEIGHT, KEY_ONE_REP_MAX} ,
KEY_DATE+ "=?", new String[] { date }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Workout workout = new Workout(cursor.getString(1), cursor.getString(2),
Integer.parseInt(cursor.getString(3)), Integer.parseInt(cursor.getString(4)), Integer.parseInt(cursor.getString(5)));
return workout;
}
这是我尝试显示结果的地方。我有时,应用程序停止工作
代码中的Workout workouts = db.getWorkout(date);
。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_workout_notes);
// Show the Up button in the action bar.
setupActionBar();
Intent intent = getIntent();
String Mdate = intent.getStringExtra(MainActivity.MONTH_DATE);
String Ydate = intent.getStringExtra(MainActivity.YEAR_DATE);
String Ddate = intent.getStringExtra(MainActivity.DAY_DATE);
final TextView textViewToChange = (TextView) findViewById(R.id.textView1);
Month = Mdate;
Year = Ydate;
Day = Ddate;
String date = (Month+"/" +Day+"/" +Year);
setTitle(date);
Databasehandler db = new Databasehandler(this);
Workout workouts = db.getWorkout(date);
String dataInfo = (workouts.getWorkout() + workouts.getReps() + workouts.getWeight());
textViewToChange.setText(dataInfo);
}
logcat的:
11-18 23:30:28.825:D / AndroidRuntime(2137):关闭VM 11-18 23:30:28.825:W / dalvikvm(2137):threadid = 1:线程退出未捕获异常(组= 0x40a71930) 11-18 23:30:28.866:E / AndroidRuntime(2137):致命异常:主要 11-18 23:30:28.866:E / AndroidRuntime(2137):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.workoutcalender / com.example.workoutcalender.WorkoutNotes}:android.database.CursorIndexOutOfBoundsException:Index请求0,大小为0 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread.access $ 600(ActivityThread.java:141) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.os.Handler.dispatchMessage(Handler.java:99) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.os.Looper.loop(Looper.java:137) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread.main(ActivityThread.java:5041) 11-18 23:30:28.866:E / AndroidRuntime(2137):at java.lang.reflect.Method.invokeNative(Native Method) 11-18 23:30:28.866:E / AndroidRuntime(2137):at java.lang.reflect.Method.invoke(Method.java:511) 11-18 23:30:28.866:E / AndroidRuntime(2137):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 11-18 23:30:28.866:E / AndroidRuntime(2137):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 11-18 23:30:28.866:E / AndroidRuntime(2137):at dalvik.system.NativeStart.main(Native Method) 11-18 23:30:28.866:E / AndroidRuntime(2137):引起:android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.database.AbstractCursor.checkPosition(AbstractCursor.java:424) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 11-18 23:30:28.866:E / AndroidRuntime(2137):at com.example.workoutcalender.Databasehandler.getWorkout(Databasehandler.java:70) 11-18 23:30:28.866:E / AndroidRuntime(2137):at com.example.workoutcalender.WorkoutNotes.onCreate(WorkoutNotes.java:48) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.Activity.performCreate(Activity.java:5104) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 11-18 23:30:28.866:E / AndroidRuntime(2137):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 11-18 23:30:28.866:E / AndroidRuntime(2137):... 11 more
我正在通过教程自己学习android编程,所以如果这很糟糕,尽量不要太苛刻。如果您需要更多信息请告诉我。
答案 0 :(得分:1)
在此代码中:
Cursor cursor = db.query(...);
if (cursor != null)
cursor.moveToFirst();
您无需检查cursor
null
,因为query
始终返回游标对象。
但是,必须检查moveToFirst
的返回值,因为游标可能不包含任何数据;这种情况必须以某种方式处理:
Cursor cursor = db.query(...);
if (cursor.moveToFirst()) {
...
return workout;
} else {
return null; // or throw an exception, or handle it in some other way
}