обновление данных в SQLite не обновляется

#android #sql #sqlite #android-studio #listview

#Android #sql #sqlite #android-studio #listview

Вопрос:

Я смотрю учебные пособия по SQL, и я застрял в обновлении существующей информации. пока я могу добавлять и удалять, я попытался использовать метод add в SQL с небольшими изменениями, чтобы функционировать как метод обновления, но он не работает, он не показывает ошибку или сбой, но исходящие данные не меняются. кроме того, внутри класса модели есть метод переопределения toString (), есть ли способ не использовать его и получить строковые результаты? потому что без toString() он показывает некоторые случайные вещи.

вот активность Java

 public class DbTestActivity extends AppCompatActivity {

    EditText etName;
    Button addName;
    Button updateName;
    ListView lv;

    dbTester db;
    ArrayAdapter arrayAdapter;
    PersonModel model;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_db_test);

        etName = findViewById(R.id.edit_name);
        addName =findViewById(R.id.add_name);
        updateName = findViewById(R.id.update_name);
        lv = findViewById(R.id.listView);

        db = new dbTester(DbTestActivity.this);

        show_data_on_lv();

        addName.setOnClickListener(view -> {
            try {

            }catch (Exception e)
            {

                Toast.makeText(this, "ERROR ADDING!!!n" e.getMessage(), Toast.LENGTH_LONG).show();
            }
            String name = String.valueOf(etName.getText());
            model =new PersonModel(-1, name);
            db.insert_data(model);
            show_data_on_lv();
        });
        updateName.setOnClickListener(view -> {


        });
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                try {
                    model = new PersonModel();
                    model.setName("updated name");
                    db.update_data(model);
                    show_data_on_lv();
                    Toast.makeText(DbTestActivity.this, "SUCCESS", Toast.LENGTH_LONG).show();
                }catch (Exception e)
                {
                    Toast.makeText(DbTestActivity.this, "ERROR UPDATING!!!n" e.getMessage(), Toast.LENGTH_LONG).show();
                }

            }
        });
    }

    private void show_data_on_lv() {
        arrayAdapter = new ArrayAdapter(DbTestActivity.this,
                android.R.layout.simple_list_item_activated_1, db.get_data());
        lv.setAdapter(arrayAdapter);
    }
}
 

вот xml

 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DbTestActivity">

    <EditText
        android:id="@ id/edit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="64dp"
        android:ems="10"
        android:hint="name"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@ id/add_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="50dp"
        android:layout_marginTop="30dp"
        android:text="add"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/edit_name" />

    <Button
        android:id="@ id/update_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="50dp"
        android:text="update"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/edit_name" />

    <ListView
        android:id="@ id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/add_name" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

вот помощник SQL

 public class dbTester extends SQLiteOpenHelper {
    public static final String TABLE = "PERSON_TABLE";
    public static final String COLUMN_NAME = "PERSON_NAME";
    public static final String COLUMN_ID = "ID";

    public dbTester(Context context) {
        super(context, "person.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String createTableStatement = "CREATE TABLE " TABLE " (" COLUMN_ID " INTEGER PRIMARY KEY AUTOINCREMENT, " COLUMN_NAME " TXT )";
        db.execSQL(createTableStatement);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS " TABLE);
    }

    public List<PersonModel>get_data()
    {
        List <PersonModel> return_data = new ArrayList<>();

        String queryString = "SELECT * FROM " TABLE;

        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.rawQuery(queryString, null);
        if (cursor.moveToFirst())
        {
            do {

                int personID = cursor.getInt(0);
                String personName = cursor.getString(1);

                PersonModel personModel = new PersonModel(personID, personName);
                return_data.add(personModel);

            }while (cursor.moveToNext());
        }
        else
        {

        }
        cursor.close();
        db.close();
        return return_data;
    }
    public boolean insert_data(PersonModel model)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues cv = new ContentValues();

        cv.put(COLUMN_NAME, model.getName());

        long insert = db.insert(TABLE, null, cv);

        if (insert == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public boolean delete_data(PersonModel model)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        String queryString = "DELETE FROM " TABLE  " WHERE " COLUMN_NAME " = " model.getName();
        db.execSQL(queryString);

        Cursor cursor = db.rawQuery(queryString,null);
        if (cursor.moveToFirst())
        {
            return true;
        }
        {
            return false;
        }
    }
    public boolean update_data(PersonModel model)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues cv = new ContentValues();

        cv.put(COLUMN_NAME, model.getName());

        db.update(TABLE, cv, COLUMN_NAME   " =? ", new String[]{COLUMN_NAME});

    return true;
    }
}
 

вот используемый класс модели

 public class PersonModel {
private String name;
private int id;

public PersonModel(){}

@Override
public String toString() {
    return "PersonModel{"  
            "name='"   name   '''  
            ", id="   id  
            '}';
}

public PersonModel(int id, String name) {
    this.name = name;
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {this.id = id;}
}
 

Комментарии:

1. Это довольно много кода для проверки. Я думаю, что это может привлечь больше внимания к сайту Code Review QA.

Ответ №1:

Чтобы обновление действительно что-то обновило, запрос на обновление должен соответствовать хотя бы одной строке. Здесь

 db.update(TABLE, cv, COLUMN_NAME   " =? ", new String[]{COLUMN_NAME});
 

вы сопоставляете столбец name с именем столбца. Используйте значение для имени в строковом массиве значений для привязки, например model.getName() , вместо COLUMN_NAME (со старым значением name, а не с тем, с которым вы хотите обновить таблицу).

кроме того, внутри класса модели есть метод переопределения toString (), есть ли способ не использовать его и получить строковые результаты? потому что без toString() он показывает некоторые случайные вещи.

Вы можете переопределить getView() свой адаптер, чтобы получить желаемый результат. Используется реализация по умолчанию ArrayAdapter toString() .

Комментарии:

1. большое вам спасибо за ваше подробное объяснение @laalto Теперь я лучше понимаю ` update ()` в sqlite. обновленные данные по-прежнему не отображаются в «ListView», я думаю, что это может быть «ArrayAdapter» должен иметь «notify ()» или что-то подобное, я не уверен, но я пытаюсь разместить его, но все еще не отображается. Мне нужно, чтобы имя было изменено с любого введенного имени на (обновленное имя) при нажатии на элемент списка