Java 在SQlite数据库和列表视图中添加新行时,所有列表行都会在自定义列表视图中重复

Java 在SQlite数据库和列表视图中添加新行时,所有列表行都会在自定义列表视图中重复,java,android,android-listview,android-sqlite,Java,Android,Android Listview,Android Sqlite,我正在开发一个移动应用程序,但我遇到了这个问题。我制作了一个列表视图,它从SQlite表获取所有数据。直到昨晚一切都正常,但今天它通过在数据库中添加新行来重复之前保存的所有行。行仅在列表视图中重复,而不在SQLite中重复。当我打开应用程序时,一切都很好,在按下对话框中的添加按钮后重复 我找了很多,但找不到解决办法 以下是我在列表视图中添加新项目的代码: alertDialog.setPositiveButton("Save", new DialogInterface.OnClickListe

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

我找了很多,但找不到解决办法

以下是我在列表视图中添加新项目的代码:

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

和刷新适配器。

不创建新适配器实例,只需在现有列表中添加一条新记录,并刷新适配器和从数据库中仅获取最后插入的行。我如何才能做到这一点?事实上,我是android开发的新手。试试我下面的答案,它会解决你的问题的。谢谢兄弟,问题解决了。你解决了,欢迎兄弟很高兴能帮你