Может ли кто-нибудь помочь мне с созданием запросов, чтобы удалить элемент списка здесь? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать код, в котором, если вы долго нажимаете на элемент из списка, он создаст выбор для его удаления.Поскольку я очень новичок в базе данных для использования Android, любая помощь будет оценена.Этот код предназначен для приложения с учетной записью, где сумма расходов будет отображаться в верхнем слое приложения, а цифры будут суммироваться с суммой расходов.Как показано здесь: https://imgur.com/a/qUwqlFJ#X2etJ0S

код действия myDBHelper:

class MyDBHelper extends SQLiteOpenHelper {
    public MyDBHelper(Context context) {

        super(context, "My_Account_Data.db", null, 4);
    }

    public void onCreate(SQLiteDatabase db) {
        String query = String.format("CREATE TABLE %s ("
                + "%s INTEGER PRIMARY KEY AUTOINCREMENT, "
                + "%s TEXT, "
                + "%s INTEGER, "
                + "%s TEXT);", TABLE_NAME, KEY_ID, KEY_CONTEXT, KEY_PRICE, KEY_DATE);
        db.execSQL(query);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME);
        db.execSQL(query);
        onCreate(db);
    }
}

часть кода основного действия, в которой происходит действие:

public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {

                    new AlertDialog.Builder(MainActivity.this)
                            .setIcon(android.R.drawable.ic_delete)
                            .setTitle("Deletion")
                            .setMessage("Do you really want to delete this content?")
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    EditText eContext = (EditText) findViewById( R.id.edit_context );
                                    EditText ePrice = (EditText) findViewById( R.id.edit_price );
                                    String contexts = eContext.getText().toString();
                                    int price = Integer.parseInt( ePrice.getText().toString() );
                                    String today_Date = getToday_date();
                                    Log.d(TAG, "Value Written" + contexts +", " + price + ", " + today_Date);

                                    String query = String.format(
                                            "DELETE FROM "+ TABLE_NAME + " WHERE " + contexts + price, View_DATE);
                                    db.execSQL( query ); // What to write in here?

                                    String queryPriceSum = String.format( " SELECT SUM(price) FROM %s WHERE date = '%s'", TABLE_NAME, View_DATE);
                                    cursor = db.rawQuery( queryPriceSum, null );
                                    cursor.moveToNext();
                                    String sum = String.valueOf(cursor.getInt(0));
                                    Log.d(TAG, "sum : " + sum);
                                    sum_view.setText(sum);

                                    // cursor.requery();
                                    String querySelectAll = String.format( "SELECT * FROM %s WHERE date = '%s'", TABLE_NAME, View_DATE);
                                    cursor = db.rawQuery( querySelectAll, null );
                                    myAdapter.changeCursor( cursor );
                                    myAdapter.notifyDataSetChanged();

                                    eContext.setText( "" );
                                    ePrice.setText( "" );
                                }
                            })
                    .setNegativeButton("No", null)
                    .show();
                return true;
            }
        });

действие адаптера курсора:

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from( context );
        View v = inflater.inflate( R.layout.list_item, parent,false );
        return v;

    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView item_context = (TextView) view.findViewById( R.id.item_context );
        TextView item_price = (TextView) view.findViewById( R.id.item_price );

        String contexts = cursor.getString( cursor.getColumnIndex( MainActivity.KEY_CONTEXT ) );
        String price = cursor.getString( cursor.getColumnIndex( MainActivity.KEY_PRICE ) );

        Log.d(TAG, contexts + ", " + price);

        item_context.setText( contexts );
        item_price.setText( price );

    }

Удаление содержимого приведет к вычитанию части суммы расходов и удалению выбранного содержимого.Как уже говорилось, любая помощь приветствуется, большое спасибо!

1.ДОПОЛНИТЕЛЬНО

После внесения изменений в соответствии с ответом MikeT я получил эту ошибку: -

2019-06-21 08:32:57.052 17280-17280/org.androidtown.mycalendar D/InputMethodManager: getNavigationBarColor() -855310
2019-06-21 08:32:57.188 17280-17280/org.androidtown.mycalendar D/ViewRootImpl@ef6be96[MainActivity]: ViewPostIme pointer 1
2019-06-21 08:32:57.190 17280-17280/org.androidtown.mycalendar D/AbsListView: onTouchUp() mTouchMode : -1
2019-06-21 08:32:57.650 17280-17280/org.androidtown.mycalendar D/ViewRootImpl@1632a00[MainActivity]: ViewPostIme pointer 0
2019-06-21 08:32:57.751 17280-17280/org.androidtown.mycalendar D/ViewRootImpl@1632a00[MainActivity]: ViewPostIme pointer 1
2019-06-21 08:32:57.768 17280-17280/org.androidtown.mycalendar D/AndroidRuntime: Shutting down VM
2019-06-21 08:32:57.770 17280-17280/org.androidtown.mycalendar E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.androidtown.mycalendar, PID: 17280
    java.lang.NumberFormatException: For input string: ""
        at java.lang.Integer.parseInt(Integer.java:627)
        at java.lang.Integer.parseInt(Integer.java:650)
        at org.androidtown.mycalendar.MainActivity$2$1.onClick(MainActivity.java:128)
        at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7045)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
2019-06-21 08:32:57.790 17280-17280/org.androidtown.mycalendar I/Process: Sending signal. PID: 17280 SIG: 9

1 Ответ

0 голосов
/ 21 июня 2019

db.execSQL (запрос); // Что писать здесь?

Это хорошо, что не хорошо: -

String query = String.format("DELETE FROM "+ TABLE_NAME + " WHERE " + contexts + price, View_DATE);

То есть предложение WHERE вряд ли принесет какую-либо пользу, так как нет никакого сравнения. Вместо этого кажется, что вы генерируете что-то вроде

DELETE FROM your_table WHERE some_valuesome_pricesome_date

Это не сработает, вероятно, потому что предложение WHERE не будет правильным именем столбца, и даже если бы оно было так, это привело бы к непредсказуемым удалениям, так как это проверило бы данные столбца, чтобы увидеть, было ли оно 0 или нет 0 ( если данные начинаются с нечислового значения, то 0, если начинается с числового значения, то очень вероятно 1). Любые строки, которые приводят к 1, будут удалены. В соответствии с SQL, как он понимается SQLite - выражение- логические выражения

Скорее вы захотите что-то вроде

String query = String.format("DELETE FROM " + TABLE_NAME + " WHERE " + KEY_CONTEXT + "= '" + contexts + "' AND " + KEY_PRICE + "=" + ePrice.getText().toString() + " AND " + KEY_DATE + "='%s'",VIEW_DATE); 

Или лучше с точки зрения предотвращения инъекций SQL: -

String query = "DELETE FROM " + TABLE_NAME + " WHERE " + KEY_CONTEXT + "=? AND " + KEY_PRICE + "=? AND " + KEY_DATE + "=?";
db.execSQL(query,new String[]{contexts,ePrice.getText().toString(),String.format("%s",VIEW_DATE)});

Или менее склонны к синтаксическим ошибкам, так как delete удобный метод создает большую часть SQL: -

db.delete(TABLE_NAME,KEY_CONTEXT+"=? AND "+KEY_PRICE+"=? AND "+KEY_DATE+"=?",new String[]{contexts,ePrice.getText().toString(),String.format("%s",VIEW_DATE)});
  • Обратите внимание, что приведенная выше строка заменяет две строки: строку, которая устанавливает значение query , и строки, которые выполняют SQL.

Примечания

  • Нет необходимости получать значение из EditText ePrice, рискуйте исключить его разбор в целое число, а затем просто преобразовать его в строку для результирующего запроса.
  • Приведенный выше код является принципиальным кодом, он не был проверен или выполнен и поэтому может иметь некоторые ошибки.
  • Типичным способом было бы использовать столбец строк, содержащий псевдоним rowid (т. Е. Столбец, который вы определили с помощью INTEGER PRIMARY KEY AUTOINCREMENT), поскольку это значение будет уникально идентифицировать соответствующую строку.
...