.如何使用 SQLite 更新单个数据库元素?

. How to update individual database elements with SQLite?

大家晚上好,这是我的DatabaseHelper class:

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 会更新,但当我重新启动模拟器时,我编辑的文本会returns 恢复到原始状态。 因此该方法不会更新数据库中的项目。我的代码有什么问题?谢谢

编辑: 这是 Main 中的 viewData 方法:

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 );

    }
}

更改 table 的定义,使 name 列唯一:

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

您必须从设备上卸载该应用程序,以便删除数据库并重新运行,以便重新创建数据库和 table。
然后像这样更改 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" );
        }
    }
});