java - Android:查询数据库时未捕获处理程序异常

标签 java android database sqlite exception

我正在尝试根据用户输入查询数据库,但出现此异常,我不知道是什么原因导致的。

这是表的架构:

private static String CREATE_TABLE_ASSOCIATION = "create table "    
        + TABLE_ASSOCIATION + "( " + COLUMN_QUESTION_ID + " integer not null, "
        + COLUMN_ANSWER + " text not null, " + COLUMN_DATETIME + " text not null, " 
        + "FOREIGN KEY (" + COLUMN_QUESTION_ID + ") REFERENCES " + TABLE_QUESTION
        + "(" + COLUMN_ID + "), FOREIGN KEY (" + COLUMN_ANSWER + ") "
        + "REFERENCES "+ TABLE_ANSWER + "(" + COLUMN_ANSWER + "), " 
        + "FOREIGN KEY (" + COLUMN_DATETIME + ") REFERENCES " + TABLE_ANSWER
        + "(" + COLUMN_DATETIME + ") PRIMARY KEY (" + COLUMN_QUESTION_ID + "," + COLUMN_DATETIME + "));";

这是 Activity 中的代码:

public void query()
{
    quesNum = (EditText)findViewById(R.id.idBox);
    startingDate = (EditText)findViewById(R.id.startDate);
    endingDate = (EditText)findViewById(R.id.endDate);
    String num, start, end;

    num = quesNum.getText().toString();
    start = startingDate.getText().toString();
    end = endingDate.getText().toString();
    ArrayList<ArrayList<String>> result = datasource.getAnswer(Integer.parseInt(num), start, end);
    textview.setText(result.get(0).toString());
}


public void onClick(View view)
{

    switch (view.getId())
    {
        case R.id.add:
                changeText();
                break;
        case R.id.query:
            query();
            break;               
    }
}

这是调用查询数据库的方法:

public ArrayList<ArrayList<String>> getAnswer(int questionId, String startDate, String endDate)
{
    String query = "SELECT " + HealthyDroidQuizHelper.COLUMN_ANSWER + ", "
    + HealthyDroidQuizHelper.COLUMN_DATETIME + " FROM " + HealthyDroidQuizHelper.TABLE_ASSOCIATION
    + " WHERE " + HealthyDroidQuizHelper.COLUMN_QUESTION_ID + " = " + questionId + " AND "
    + HealthyDroidQuizHelper.COLUMN_DATETIME + " BETWEEN " + startDate + " AND " + endDate;

    ArrayList<ArrayList<String>> totalResults = new ArrayList<ArrayList<String>>();
    ArrayList<String> QuizResults = new ArrayList<String>();
    String ans, currDate, oldDate = null;

    Cursor cursor = database.rawQuery(query, null);
    cursor.moveToFirst();
    oldDate = cursor.getString(cursor.getColumnIndex(HealthyDroidQuizHelper.COLUMN_DATETIME));
    QuizResults.add(oldDate);
    while(!cursor.isAfterLast())
    {
        currDate = cursor.getString(cursor.getColumnIndex(HealthyDroidQuizHelper.COLUMN_DATETIME));
        if(!oldDate.equalsIgnoreCase(currDate))
        {
            QuizResults.add(currDate);
            oldDate = currDate;
        }

        ans = cursor.getString(cursor.getColumnIndex(HealthyDroidQuizHelper.COLUMN_ANSWER));
        QuizResults.add(ans);
        cursor.moveToNext();
    }

    totalResults.add(QuizResults);
    return totalResults;
}

最后,这是 Logcat 输出:

05-09 19:07:32.897: D/AndroidRuntime(1229): Shutting down VM
05-09 19:07:32.897: W/dalvikvm(1229): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-09 19:07:32.897: E/AndroidRuntime(1229): Uncaught handler: thread main exiting due to uncaught exception
05-09 19:07:32.907: E/AndroidRuntime(1229): java.lang.IllegalStateException: Could not execute method of the activity
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.View$1.onClick(View.java:2031)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.View.performClick(View.java:2364)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.View.onTouchEvent(View.java:4179)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.View.dispatchTouchEvent(View.java:3709)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.os.Looper.loop(Looper.java:123)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.app.ActivityThread.main(ActivityThread.java:4363)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at java.lang.reflect.Method.invokeNative(Native Method)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at java.lang.reflect.Method.invoke(Method.java:521)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at dalvik.system.NativeStart.main(Native Method)
05-09 19:07:32.907: E/AndroidRuntime(1229): Caused by: java.lang.reflect.InvocationTargetException
05-09 19:07:32.907: E/AndroidRuntime(1229):     at ca.bcit.comp4900.TestDatabaseActivity.onClick(TestDatabaseActivity.java:74)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at java.lang.reflect.Method.invokeNative(Native Method)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at java.lang.reflect.Method.invoke(Method.java:521)
05-09 19:07:32.907: E/AndroidRuntime(1229):     at android.view.View$1.onClick(View.java:2026)
05-09 19:07:32.907: E/AndroidRuntime(1229):     ... 22 more
05-09 19:07:32.907: E/AndroidRuntime(1229): Caused by: java.lang.NullPointerException
05-09 19:07:32.907: E/AndroidRuntime(1229):     at ca.bcit.comp4900.TestDatabaseActivity.query(TestDatabaseActivity.java:60)
05-09 19:07:32.907: E/AndroidRuntime(1229):     ... 26 more
05-09 19:07:32.937: I/dalvikvm(1229): threadid=7: reacting to signal 3
05-09 19:07:32.947: I/dalvikvm(1229): Wrote stack trace to '/data/anr/traces.txt'

提前致谢!

最佳答案

错误如下:

由以下原因引起:android.database.sqlite.SQLiteException:接近“AND”:语法错误:,编译时:SELECT 答案,dateTime FROM 关联 WHERE QuestionId = 1 AND dateTime BETWEEN AND

您的 WHERE 子句显示“...dateTime BETWEEN AND...”关键字“BETWEEN”和“AND”之间缺少一个参数。

所以看起来 startDate (也可能是 endDate)在 getAnswer() 中是空字符串。

关于java - Android:查询数据库时未捕获处理程序异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522156/

相关文章:

java - 如何判断一个数是否可​​以用A^B的形式表示?

android - 不是从 Activity 中调用 PICK_CONTACT Intent

mysql - 未找到列 : 1054 Unknown column '` default `' in ' where clause', 查询为 : SELECT `main_table` . * FROM `fastimporter_attributes`

java - 使用数据库访问的 OOP 编程

java - 如何在 JVM run 调用之间保留大型 Java 对象

java - 在 repl.it 上反转 java 中的字符串

java - 重新启动 Java Swing 应用程序

javascript - 如何在 React-native 中覆盖其他应用程序?

java - 单击按钮时如何在执行之前取消计时器任务

php - 编写易于替换的php数据库类