Как сохранить элемент массива, нажатый на sqlite - PullRequest
0 голосов
/ 03 октября 2019

У меня есть список с массивом в нем. Я пытаюсь сохранить элемент, когда он щелкает по моей базе данных, чтобы я мог вспомнить, какие элементы были проверены при запуске.

          if (checkedTextView.isChecked()) {

                db.execSQL("INSERT INTO list(found) VALUES (item.toString)");

                if (score < 1119) {
                    score++;

                } else {
                    score++;
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            levelFinishedConstraint.setVisibility(View.VISIBLE);
                        }

                    }, 1000);
                }
            } else {

                db.execSQL("DELETE FROM list WHERE found = item.toString");
                score = score - 1;


            }

    Cursor c = db.rawQuery("SELECT * FROM list", null);
    int foundIndex = c.getColumnIndex("found");
    if (c != null && c.moveToFirst()) {
        do {
        c.getString(foundIndex);
        } while (c.moveToNext());
        c.close(); }
    String[] foundList = new String[foundIndex];
     Log.i("DATABASE", c.getString(foundIndex));

В нынешнем виде приложение вылетает, когда я открываю страницу, ачем при нажатии на элемент. Следующее является ключевой ошибкой, которая продолжает появляться

Process: com.example.woodlandwanderer, PID: 7370
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.woodlandwanderer/com.example.woodlandwanderer.levelOneActivity}: android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:468)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
    at com.example.woodlandwanderer.levelOneActivity.onCreate(levelOneActivity.java:172)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

Так как item - это некоторый объект, я думаю, и вы хотите, чтобы это был StringResult, попробуйте

db.execSQL("DELETE FROM list WHERE found = '" + item.toString + "'");
0 голосов
/ 03 октября 2019

От: https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL(java.lang.String)

public void execSQL (String sql)Выполните один оператор SQL, который НЕ является SELECT, или любой другой оператор SQL, который возвращает данные.

Таким образом, вы можете использовать эту перегрузку execSQL() для вставки или удаления данных, но вам также придется объединитьпараметр, который вы хотите передать в одинарных кавычках, и это небезопасно, поскольку оно оставляет ваше приложение широко открытым для sql инъекций . Также из: https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL(java.lang.String,%20java.lang.Object%5B%5D)

public void execSQL (String sql, Object [] bindArgs)Выполните одну инструкцию SQL, которая НЕ ВЫБРАТЬ / ВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ.

Итак execSQL() - это , а не рекомендуемый способ вставки или удаления строк. Вместо этого используйте метод insert(), предоставив значения столбцов в объекте ContentValues и метод delete():

ContentValues cv = new ContentValues();
cv.put("found", item.toString);
boolean inserted = db.insert("list", null, cv) > 0;

Вы можете проверить boolean переменную inserted после этого кода, чтобы узнать, была ли вставка успешной. И чтобы удалить строку:

boolean deleted = db.delete("list", "found = ?", new String[] {item.toString}) > 0;

Вы можете проверить boolean переменную deleted после этого кода, чтобы получить, если удаление было успешным. Чтобы этот код работал, вы должны правильно инициализировать переменную db, имя таблицы должно быть "list", а имя столбца "found". Также убедитесь, что item.toString() возвращает значение, которое вы хотите найти.

0 голосов
/ 03 октября 2019

android.database.sqlite.SQLiteException: no such column: item.toString (code 1): , while compiling: INSERT INTO list(found) VALUES (item.toString)

Эта ошибка связана с тем, что item.toString не заключен в одинарные кавычки. Это можно исправить с помощью: -

db.execSQL("INSERT INTO list(found) VALUES ('item.toString')");

НО действительно ли вы хотите вставить строку, в которой найденный столбец имеет значение "item.toString". Я очень сомневаюсь в этом, и вы вполне можете получить множество строк с одинаковым, вероятно, бесполезным значением.

То, что вам нужно, это: -

db.execSQL("INSERT INTO list(found) VALUES (?)", new String[]{item.toString});

Тогда значение, котороебудет вставлено, что бы метод item s toString возвращал. То есть ? заменяется элементами в массиве (первый - заменяется первым элементом массива, второй - вторым элементом и т. Д.). В замене? также используются правильные корпуса.

Альтернативный, но не рекомендуемый способ - использовать: -

db.execSQL("INSERT INTO list(found) VALUES ('" + item.toString + "')");

  • Этоне рекомендуется, так как он открыт для возможного внедрения SQL.

Аналогично ,

db.execSQL("DELETE FROM list WHERE found = item.toString");

Будет иметь те же проблемы, которые должны быть: -

db.execSQL("DELETE FROM list WHERE found = ?",new String[]{item.toString});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...