.如何使用 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" );
}
}
});
大家晚上好,这是我的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" );
}
}
});