Как избежать дублирования значений при вставке данных в базу данных sqlite? - PullRequest
0 голосов
/ 07 ноября 2019

Я стараюсь не вставлять дублирующее значение в sqlite в Android, но я не могу понять, как избежать вставки дублирующегося значения, так как я новичок в android sqlite.i я пытался найти решение в Интернете, ноя не получил никакого удовлетворительного ответа. Пожалуйста, помогите мне решить эту проблему.

Мой код указан ниже.

# Мой код MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText nameEditText, ageEditText, genderEditText;

    MyDatabaseHelper myDatabaseHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nameEditText = findViewById(R.id.nameEditTextId);
        ageEditText = findViewById(R.id.ageEditTextId);
        genderEditText = findViewById(R.id.genderEditTextId);
        Button addButton = findViewById(R.id.addButtonId);

        myDatabaseHelper = new MyDatabaseHelper(this);


        addButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        String name = nameEditText.getText().toString();
        String age = ageEditText.getText().toString();
        String gender = genderEditText.getText().toString();

        if (view.getId() == R.id.addButtonId) {

            if(TextUtils.isEmpty(name) && TextUtils.isEmpty(age) && TextUtils.isEmpty(gender) ){

                Toast.makeText(getApplicationContext(), "Enter details and submit ", Toast.LENGTH_LONG).show();

            }

            else if (TextUtils.isEmpty(name)) {

                Toast.makeText(getApplicationContext(), "Insert the name first ", Toast.LENGTH_LONG).show();

            }else if ( TextUtils.isEmpty(age)){

                Toast.makeText(getApplicationContext(), "Insert an age ", Toast.LENGTH_LONG).show();


            }else if (TextUtils.isEmpty(gender)){

                Toast.makeText(getApplicationContext(), "Insert the gender ", Toast.LENGTH_LONG).show();

            }else {

                long rowId = myDatabaseHelper.insertData(name, age, gender);

                if (rowId == -1) {
                    Toast.makeText(getApplicationContext(), "unsuccessfull ", Toast.LENGTH_LONG).show();

                } else {
                    Toast.makeText(getApplicationContext(), "Row " + rowId + " is sucessfully inserted ", Toast.LENGTH_LONG).show();

                }

                //clear screen after inserting value;
                nameEditText.setText("");
                ageEditText.setText("");
                genderEditText.setText("");


            }


        }

    }

}

Мой код MyDataBaseHelper:

public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final  String DATABASE_NAME = "Student.db";
    private static final String TABLE_NAME = "student_details";
    private static final String ID = "_id";
    private static final String NAME = "Name";
    private static final String AGE = "Age";
    private static final String GENDER = "Gender";
    private static final int VERSION_NUMBER = 3 ;
    private static final String CREATE_TABLE = "CREATE TABLE  "+TABLE_NAME+" ("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255), "+AGE+" INTEGER, "+GENDER+"); ";
    private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
    private Context context;

    MyDatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null,VERSION_NUMBER);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        try {
            Toast.makeText(context,"onCreate is called  ", Toast.LENGTH_LONG).show();

            sqLiteDatabase.execSQL( CREATE_TABLE);
        }catch (Exception e){

            Toast.makeText(context,"Exceptin : " +e, Toast.LENGTH_LONG).show();

        }



    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        try {
            Toast.makeText(context,"onUpgrade is called " , Toast.LENGTH_LONG).show();
            sqLiteDatabase.execSQL(DROP_TABLE);
            onCreate(sqLiteDatabase);
        }catch (Exception e){
            Toast.makeText(context,"Exceptin : " +e, Toast.LENGTH_LONG).show();
        }


    }
    long insertData(String name, String age, String gender){

        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(NAME,name);
        contentValues.put(AGE,age);
        contentValues.put(GENDER,gender);

        return sqLiteDatabase.insert(TABLE_NAME,null,contentValues);
    }
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Добавьте UNIQUE constraint к вашей таблице для комбинации столбцов Name, Age и Gender. Измените свой оператор CREATE следующим образом:

private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
        ID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
        NAME + " TEXT, " +
        AGE + " INTEGER, "+
        GENDER + " TEXT, " +
        "UNIQUE(" + NAME + ", " + AGE + ", "  + GENDER + ")" +
        ");";

Если вы хотите, чтобы только Name был уникальным:

private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
        ID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
        NAME + " TEXT UNIQUE, " +
        AGE + " INTEGER, "+
        GENDER + " TEXT +
        ");";

Если вы попытаетесь вставить дубликат метода insert()вернет -1.

0 голосов
/ 07 ноября 2019

Я не знаю, есть ли простой способ сделать это, но у меня есть идея, что это может помочь, почему бы вам не создать еще один столбец для объединения значений, которые вы хотите предотвратить, чтобы они дублировались, и проверить его? перед добавлением новой строки вы можете оставить этот ответ отдельно, пока не найдете наилучшую практику

...