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 行更新行为不一致

使用按钮单击更新 SQlite 数据库中的一行 [重复]

Xamarin.Forms 中的 sqlite 如何更新本地数据库中的单个记录

如何在应用程序版本更新时维护 iPhone 上 SQLite 数据库中的数据?

sqlite中数据存在更新,数据不存在添加的语句怎么写