java - 在 SQlite 数据库中添加新行然后在 ListView 中添加新行时,所有列表行在自定义 ListView 中重复

标签 java android android-listview android-sqlite

我正在构建一个移动应用程序,但我遇到了这个问题。我制作了一个 ListView ,它从 SQlite 表中获取所有数据。直到昨晚一切都运行良好,但今天它通过在数据库中添加一个新行来重复之前保存的所有行。行仅在 ListView 中重复,而不是在 SQLite 中。当我打开应用程序时,一切正常,在按下对话框内的添加按钮后重复。

我搜索了很多,但找不到解决方案。

这是我在 ListView 中添加新项目的代码:

alertDialog.setPositiveButton("Save", new 
DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        if (input.length() != 0 && inputBlnc.length() != 0) {
                            String result = input.getText().toString();
                            input.setText("");
                            String resultBlnc = inputBlnc.getText().toString();
                            inputBlnc.setText("");
                            addDataInAcc(result, resultBlnc);
                            dialog.dismiss();
                            Cursor data = mdatabaseHelper.getData();
                            if (data != null) {
                                while (data.moveToNext()) {
                                    listRec.add(new ModelAccounts(data.getString(1), data.getString(3)));
                                    Log.d(TAG, "ADDING " + data.getString(1) + " to ARRAY");
                                }
                                customAdapter = new AccountsAdapter(getApplicationContext(), listRec);
                                customAdapter.notifyDataSetChanged();
                                listView.setAdapter(customAdapter);
                            } else {
                                Toast.makeText(AccountsActivity.this, "Create a new account", Toast.LENGTH_SHORT).show();
                            }
                        } else {
                            Toast.makeText(AccountsActivity.this, "Please enter both things", Toast.LENGTH_SHORT).show();
                        }
                    }catch (Exception exc){
                        Toast.makeText(AccountsActivity.this, ""+ exc.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            });

数据库助手

   public boolean addDataInAccounts(String accountName, String opBlnc)
   {


    SQLiteDatabase db1 = this.getWritableDatabase() ;


    ContentValues contentValues1 = new ContentValues() ;

    contentValues1.put(TABLE_COL2, accountName);

    contentValues1.put(TABLE_COL4, opBlnc);

    Log.d(TAG, "Add Data : Adding " + accountName + " and " + opBlnc + " to " + TABLE_NAME) ;

    long result = db1.insert(TABLE_NAME, null, contentValues1) ;

    if (result == -1){
        return false ;
    }else {
        return true ;
    }
}

完整代码:DataBaseHelper 类:

package com.example.fahad.softixtechnologies.Helpers;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

import com.example.fahad.softixtechnologies.models.ModelAccounts;

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TAG = "DatabaseHelper" ;
private static final String TAG1 = "DatabaseHelper" ;

public static final String DB_NAME = "softix.db" ;
public static final String TABLE_NAME = "Account_Master" ;
public static final String TABLE_COL4 = "op_blnc" ;
public static final String TABLE_COL1 = "acc_id" ;
public static final String TABLE_COL2 = "acc_title" ;
public static final String TABLE_COL3 = "group_id" ;
public static final String TABLE1_NAME = "groups" ;
public static final String TABLE2_NAME = "users" ;
public static final int DB_VERSION = 2 ;
private final Context context ;

public DatabaseHelper(Context context){
    super(context, DB_NAME, null, DB_VERSION);
    this.context=context ;
}

@Override
public void onCreate(SQLiteDatabase db) {

    String groupsTabledb = "CREATE TABLE " + TABLE1_NAME + " " +
            "(group_id INTEGER PRIMARY KEY AUTOINCREMENT, group_title VARCHAR(30))" ;
    String accountsTabledb = "CREATE TABLE " + TABLE_NAME + " " +
            "(" + TABLE_COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + TABLE_COL2 + " VARCHAR(50), " +
            TABLE_COL3 + " INTEGER, " + TABLE_COL4 + " VARCHAR(50))" ;
    String usersTabledb = "CREATE TABLE " + TABLE2_NAME + " " +
            "(user_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT)" ;

    try {
        db.execSQL(groupsTabledb);
        db.execSQL(accountsTabledb);
        db.execSQL(usersTabledb);
    }catch (Exception e){
        Log.d(TAG1, e.getMessage());
    }
}

public boolean addUser(String name, String password){

    SQLiteDatabase db = getWritableDatabase() ;
    ContentValues contentValues = new ContentValues() ;
    contentValues.put("username", name);
    contentValues.put("password", password);
    long result = db.insert(TABLE2_NAME,null, contentValues) ;

    if (result == -1){
        return false ;
    }else {
        return true ;
    }
}

public boolean addDataInAccounts(String accountName, String opBlnc){

    SQLiteDatabase db1 = this.getWritableDatabase() ;
    ContentValues contentValues1 = new ContentValues() ;
    contentValues1.put(TABLE_COL2, accountName);
    contentValues1.put(TABLE_COL4, opBlnc);

    Log.d(TAG, "Add Data : Adding " + accountName + " and " + opBlnc + " to " + TABLE_NAME) ;

    long result = db1.insert(TABLE_NAME, null, contentValues1) ;

    if (result == -1){
        return false ;
    }else {
        return true ;
    }
}
public boolean checkUsernamePassword(String username,String password){
    SQLiteDatabase db = this.getReadableDatabase() ;
    Cursor cursor = db.rawQuery("Select * from " + TABLE2_NAME +
            " where username=? and password=?", new String[]{username,password}) ;
    if (cursor.getCount()>0){return true;}else {return false;}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String groupsTabledb = "DROP TABLE IF EXISTS " + TABLE1_NAME ;
    String accountsTabledb = "DROP TABLE IF EXISTS " + TABLE_NAME ;
    String usersTabledb = "DROP TABLE IF EXISTS " + TABLE2_NAME ;
    if (oldVersion == 2) {
        db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + TABLE_COL4 + " VARCHAR(60)");
    }else{
        Toast.makeText(context, "Data not upgraded", Toast.LENGTH_SHORT).show();
    }
    db.execSQL(groupsTabledb);
    db.execSQL(accountsTabledb);
    db.execSQL(usersTabledb);

    onCreate(db);
}
public Cursor getData(){
    SQLiteDatabase database = this.getWritableDatabase() ;
    String query = "SELECT * FROM " + TABLE_NAME ;
    Cursor datas = database.rawQuery(query, null) ;
    return datas ;
}

public void deleteRow(ModelAccounts nameAcc){
    SQLiteDatabase database = this.getWritableDatabase() ;
    database.delete(TABLE_NAME, TABLE_COL2 + "= ?",
            new String[]{String.valueOf(nameAcc.getAccName())});
    database.close();
}

最佳答案

清除现有列表并设置新列表

    Cursor data = mdatabaseHelper.getData();
                                if (data != null) {
       listRec=new ArrayList(ModelAccounts); // create new instance or clear existing list

                                    while (data.moveToNext()) {
                                        listRec.add(new ModelAccounts(data.getString(1), data.getString(3)));
                                        Log.d(TAG, "ADDING " + data.getString(1) + " to ARRAY");
                                    }
                                    customAdapter = new AccountsAdapter(getApplicationContext(), listRec);
                                    customAdapter.notifyDataSetChanged();
                                    listView.setAdapter(customAdapter);
                                } else {
                                    Toast.makeText(AccountsActivity.this, "Create a new account", Toast.LENGTH_SHORT).show();
                                }

或者你可以从数据库中获取最后插入的记录并设置到现有列表中

  Ex.
    listRec.add(new ModelAccounts(data.getString(1), data.getString(3)));
customAdapter.notifyDataSetChanged();

并刷新适配器。

关于java - 在 SQlite 数据库中添加新行然后在 ListView 中添加新行时,所有列表行在自定义 ListView 中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54434982/

相关文章:

android - 如何从 ListView 过滤器中删除弹出文本?

java - Dozer:更改字段名称策略

java - 如何在 JLabel 中显示 JTextField 的输入?如何修复反射错误?

java - 教科书中的类型转换问题——它是 0.05 还是 0.5?

android - android AccountManager 有什么用?

android - 主详细信息流程中的回调 'magic'

android - 具有 ViewHolder 模式的 ListView 中的远程图像

java - 将所有用户数据存储在单个文件中是否安全?

java - 为什么 TextView 无法显示从 Android 资源引用的格式化文本?

android - 两个启动器 Activity