, Как обновить отдельные элементы базы данных с помощью SQLite? - PullRequest
1 голос
/ 27 апреля 2020

Добрый вечер всем, это мой класс DatabaseHelper:

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "Users.db";
private static final String DB_TABLE = "Users_Table";

//Colonne
private static final String ID = "ID";
private static final String NAME = "NAME";

private static final String CREATE_TABLE = "CREATE TABLE "+ DB_TABLE+" ("+
        ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
        NAME+ " TEXT "+ ")";

public DatabaseHelper (Context context) {
    super(context, DB_NAME, null, 1);
}

@Override
public void onCreate (SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);

}

@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL( "DROP TABLE IF EXISTS "+ DB_TABLE );

    onCreate( db );
}

public boolean updateData(int id, String name) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues(  );
    contentValues.put( NAME, name );
    contentValues.put( ID, id );
    db.update( DB_TABLE, contentValues, "ID = ?", new String[] {String.valueOf( id )} );
    db.close();
    return true;

}

//Metodo per inserire dati
public boolean insertData (String name) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues(  );
    contentValues.put( NAME, name );

    long result = db.insert( DB_TABLE, null, contentValues );

    return result != -1;  //Se il risultato è = -1 i dati NON vengono inseriti
}
    //Metodo per cancellare i dati
    public int deleteSelectedItem(String NAME) {
    SQLiteDatabase db = this.getWritableDatabase();
    int result = db.delete( DB_TABLE, "NAME = ?", new String[] {NAME} );
    return result;
    }
//Metodo per visualizzare i dati
public Cursor viewData(){
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "Select * from "+DB_TABLE;
    Cursor cursor = db.rawQuery(query, null);

    return cursor;
}}

В MainActivity я вызываю метод следующим образом:

builder.setPositiveButton( "Modifica", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick (DialogInterface dialog, int which) {
                                    if (!editText.getText().toString().isEmpty()) {
                                        listItem.set( position, editText.getText().toString().trim() );

                                        db.updateData( editText.getText().toString() );
                                        arrayAdapter.notifyDataSetChanged();
                                        Toast.makeText( MainActivity.this, "Elemento modificato", Toast.LENGTH_SHORT ).show();
                                    } else {
                                        editText.setError( "aggiungi elemento qui" );
                                    }

                                }
                            } );

Когда я его использую, ListView обновляется, но когда я перезапускаю эмулятор, отредактированный текст возвращается в исходное состояние. Таким образом, метод не обновляет элементы в базе данных. Что не так с моим кодом? Спасибо

РЕДАКТИРОВАТЬ: Это метод viewData в Main:

private void viewData () {
    Cursor cursor = db.viewData();

    if (cursor.getCount() == 0) {
        Toast.makeText( this, "Nessun dato da visualizzare", Toast.LENGTH_SHORT ).show();
    } else {
        while (cursor.moveToNext()) {
            listItem.add( cursor.getString( 1 ) );
            //index 1 è il nome, index 0 è l'ID
        }

        arrayAdapter = new ArrayAdapter<>( MainActivity.this, R.layout.support_simple_spinner_dropdown_item, listItem );
        userlist.setAdapter( arrayAdapter );

    }
}

1 Ответ

1 голос
/ 28 апреля 2020

Измените определение таблицы так, чтобы столбец name был уникальным:

private static final String CREATE_TABLE = "CREATE TABLE "+ DB_TABLE+" ("+
        ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
        NAME+ " TEXT UNIQUE"+ ")";

Вам придется удалить приложение с устройства, чтобы удалить базу данных, и выполнить ее повторно, чтобы база данных и стол воссоздан. Затем измените updateData() следующим образом:

public boolean updateData(String currentName, String newName) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues(  );
    contentValues.put( NAME, newName );
    boolean result = db.update( DB_TABLE, contentValues, NAME + " = ?", new String[] {currentName} ) > 0;
    db.close();
    return result;
}

Таким образом, вы передаете текущее имя в updateData(), чтобы найти строку, которую хотите обновить. Наконец измените слушателя кнопки:

builder.setPositiveButton( "Modifica", new DialogInterface.OnClickListener() {
    @Override
    public void onClick (DialogInterface dialog, int which) {
        if (!editText.getText().toString().isEmpty()) {
            db.updateData( listItem.get( position ), editText.getText().toString().trim() );
            listItem.set( position, editText.getText().toString().trim() );
            arrayAdapter.notifyDataSetChanged();
            Toast.makeText( MainActivity.this, "Elemento modificato", Toast.LENGTH_SHORT ).show();
        } else {
            editText.setError( "aggiungi elemento qui" );
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...