首页 > 解决方案 > 单击 ListView 中的项目时,我的应用程序崩溃并创建 SQLite 编译错误。怎么了?

问题描述

这是 logcat 中的崩溃报告:

 android.database.sqlite.SQLiteException: near "Press": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT ID FROM BUTTONMANAGER WHERE FULL_NAME = James Smith AND DATE_ADDED = 7/30/2020

我正在尝试获取数据库中列表视图中的项目名称与 FULL_NAME 匹配并且添加的日期与 DATE_ADDED 匹配的行的项目 ID。

我不确定我在这里做错了什么。我查看了我的 queryString 的语法,没有发现任何错误。当我只检查 FULL_NAME 而不是 DATE_ADDED 时,应用程序不会崩溃。但是,我想检查 DATE_ADDED 以确保我删除了数据库中的正确行。

这是我的 DatabaseHelper 代码:

    public Cursor getItemID(String name, String dateAdded) {
    SQLiteDatabase db = this.getWritableDatabase();
    String queryString = "SELECT " + COLUMN_ID + " FROM " + BUTTON_MANAGER + " WHERE " + COLUMN_FULL_NAME + " = " + name + " AND " + COLUMN_DATE_ADDED + " = " + dateAdded;

    Cursor data = db.rawQuery(queryString, null);
    return data;
}

这是我的主要活动:

        mainListView = (ListView) findViewById(R.id.mainListView);
    mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String name = parent.getItemAtPosition(position).toString();
            String dateAdded = dateButton.getText().toString();

            Cursor data = databaseHelper.getItemID(name, dateAdded); //Get ID associated with name of item in ListView
            int itemID = -1;
            while(data.moveToNext()) {
                itemID = data.getInt(0);
            }

            if (itemID > -1) {
                Intent editExerciseIntent = new Intent(MainActivity.this, edit_existing_exercise.class);
                editUserIntent.putExtra("id", itemID);
                editUserIntent.putExtra("name", name);
                editUserIntent.putExtra("dateAdded", dateAdded);
                startActivity(editUserIntent);
                overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
            }
        }
    });
}

当我单击 ListView 中的项目时发生崩溃。

更多崩溃报告:

    android.database.sqlite.SQLiteException: near "Press": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT ID FROM BUTTONMANAGER WHERE FULL_NAME = James Smith AND DATE_ADDED = '7/30/2020'
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1016)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:61)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1545)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1484)
    at com.mycompany.mainapp.DatabaseHelper.getItemID(DatabaseHelper.java:118)
    at com.mycompany.mainapp.MainActivity$15.onItemClick(MainActivity.java:404)
    at android.widget.AdapterView.performItemClick(AdapterView.java:330)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1187)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3179)
    at android.widget.AbsListView$3.run(AbsListView.java:4097)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7478)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

标签: javaandroidsqliteandroid-studio

解决方案


看起来语法错误是由于您添加的日期中的斜杠造成的。

尝试这个

String queryString = "SELECT " + COLUMN_ID + " FROM " + BUTTON_MANAGER + " WHERE " + COLUMN_FULL_NAME + " = " + name + " AND " + COLUMN_DATE_ADDED + " = '" + dateAdded + "'";

推荐阅读