SQLite 中的更新数据不更新
Posted
技术标签:
【中文标题】SQLite 中的更新数据不更新【英文标题】:update data in SQLite does not update 【发布时间】:2021-03-24 22:53:09 【问题描述】:我正在观看有关 SQL 的教程,但在更新现有信息时遇到了困难。到目前为止,我能够添加和删除,我尝试在 SQL 中使用 add 方法,几乎没有更改作为更新方法,但它不起作用,它没有显示错误或崩溃,但现有数据没有改变。另外,模型类中有一个 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_
android:layout_
tools:context=".DbTestActivity">
<EditText
android:id="@+id/edit_name"
android:layout_
android:layout_
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_
android:layout_
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_
android:layout_
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_
android:layout_
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;
【问题讨论】:
这是相当多的代码要检查。我认为这可能会在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()
。
【讨论】:
非常感谢您的详尽解释@laalto 我现在对 sqlite 中的`update()`有了更好的理解。更新的数据仍然没有显示在`listView`中我认为它可能是`arrayAdapter`应该有`notify()`或类似的东西我不确定但我正在尝试放置它但仍然没有出现。单击列表项时,我需要将名称从任何输入的名称更改为(更新的名称)以上是关于SQLite 中的更新数据不更新的主要内容,如果未能解决你的问题,请参考以下文章
Sqlite 数据库更新触发服务通过 Content Observer 更新
从 sqlite3 数据库上的表单提交中的 sqlalchemy 行更新行为不一致
Xamarin.Forms 中的 sqlite 如何更新本地数据库中的单个记录