如何查询SQLite的某些行?

时间:2013-11-18 22:51:43

标签: android sqlite

我正在制作一个简单的锻炼日历安卓应用程序。我想查询我的数据库中的某些日期并显示这些行。我只是通过查看教程来学习如何使用数据库,但我现在似乎陷入困境。任何帮助,将不胜感激。这是我试过的查询的代码。

    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编程,所以如果这很糟糕,尽量不要太苛刻。如果您需要更多信息请告诉我。

1 个答案:

答案 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
}