Запретить дубликаты при добавлении в базу данных SQLite - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время у меня есть программа ввода оценок учеников / классов, которая принимает следующие данные: идентификатор ученика, имя, фамилия, идентификатор класса, имя класса, балл и буквенный балл.

По очевидным причинамЯ хотел бы запретить пользователю вводить дубликаты записей для одной и той же пары студент / курс (идентификатор студента, идентификатор класса), а также дубликаты записей для одного и того же идентификатора студента и имени / фамилии.(Два студента не должны заполнять один и тот же идентификатор.

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

 db=openOrCreateDatabase("STUDENTGRADES", Context.MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS CUSTOMER_TABLE(studentid VARCHAR, fname VARCHAR, lname VARCHAR, classid VARCHAR, classname VARCHAR, pointgrade INTEGER, lettergrade VARCHAR);");


    add.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(fname.getText().toString().trim().length()==0||
                    lname.getText().toString().trim().length()==0 || studentid.getText().toString().trim().length()==0)
            {
                showMessage("Error", "Please enter First & Last Name and Student ID");
                return;
            }
            db.execSQL("INSERT INTO CUSTOMER_TABLE VALUES('"+studentid.getText()+"','"+fname.getText()+"','"+lname.getText()+"','"+classid.getText()+"','"+classname.getText()+
                    "','"+pointgrade.getText()+"','"+lettergrade.getText()+"');");
            showMessage("Success", "Student Record added successfully");
            clearText();
        }
    });

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете использовать метод insertWithOnConflict с флагом CONFLICT_IGNORE , если вы не хотите заменять эти строки.Если нет такого же необработанного, метод возвращает -1 , поэтому вы можете обработать его

РЕДАКТИРОВАНИЕ:

Сначала необходимо создатьУНИКАЛЬНЫЕ строки (в вашем случае - идентификатор класса и идентификатор студента):

db.execSQL("CREATE TABLE YOURDB (" 
            + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
            + "STUDENTID TEXT UNIQUE, " 
            + "CLASSID TEXT UNIQUE);"); 

затем создайте переменную для проверки результата метода

int k = 0;

попытайтесь вставить значения и получить результат в нашем k

try {
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            k = db.insertWithOnConflict("YOURDB",null, contentValues, SQLiteDatabase.CONFLICT_IGNORE);

            db.close();
        }

и, наконец, проверьте вашу переменную (я сделал все в AsyncTask, поэтому метод для проверки находится в onPostExecute () метод)

@Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (k==-1){
            Toast.makeText(getApplicationContext(), "Same raws", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "not same raws", Toast.LENGTH_SHORT).show();
        }
    }

если совпадения значений, база данных не будет обновлена, и ваше k get -1 значение, так что вы можете сделать Toast или что-то еще для его обработки

РЕДАКТИРОВАТЬ 2:

о инициализации ContentValue:

сначала вы должны получить значения, например, вы получите их из editText:

String studentIdUpdate = studentEditText.getText().toString();
String classIdUpdate = classEditText.getText().toString();

, а затем создайте переменную ContentValues ​​и поместите в нее значения

ContentValues contentValues = new ContentValues();
contentValues.put("STUDENTID", studentIdUpdate);
contentValues.put("CLASSID", classIdUpdate);
0 голосов
/ 30 мая 2018

Когда вы используете простой плоский файл, содержащий всю эту информацию, легко получить информацию из синхронизации.То есть один и тот же идентификатор студента, связанный с несколькими именами, или один и тот же идентификатор класса, связанный с несколькими именами классов.Кроме того, требуется дополнительная работа для обеспечения синхронизации, если имя ученика или имя класса необходимо изменить.Не говоря уже о необходимости минимизировать дублирующиеся записи.Первый шаг к тому, чтобы разобраться в этом беспорядке, - изменить дизайн базы данных.Для данных, которые вы упомянули здесь, я бы использовал три таблицы:

Students
ID            Name
------------  ---------------------------------
1             Henry
2             Molly
3             George

Classes
ID            Name
------------  --------------------------------
1             Ohio History
2             US History
3             World History

Grades
StudentID     ClassID       Grade         LetterGrade
------------  ------------  ------------  ------------
1             1             98            A
2             3             85            B
3             2             77            C
1             2             85            B
3             3             92            A

Задайте первичный ключ для учеников и классов в поле идентификатора, а для классов - составной из (StudentID, ClassID).Это предотвратит наличие у одного учащегося нескольких оценок за один и тот же класс, а также у нескольких учеников одинаковый идентификатор.То же самое для классов.

Теперь ваш пользовательский интерфейс может позволить пользователю выбрать ученика, выбрать класс, а затем назначить оценку.Буквенная оценка может быть рассчитана или введена.


Вот как я бы определил таблицы:
create table if not exists students (
  id          integer primary key autoincrement,
  last_name   varchar,
  first_name  varchar);

create table if not exists classes (
  id          integer primary key autoincrement,
  name        varchar);

create table if not exists grades (
  student_id    integer not null,
  class_id      integer not null,
  point_grade   integer,
  letter_grade  varchar,
  primary key (student_id, class_id),
  foreign key (student_id) references students,
  foreign key (class_id) references classes)
without rowid;

Ограничения внешнего ключа не позволяют вводить оценки для несуществующих учащихся или классов, а также предотвращают удаление учащихся или классов с оценками.Существуют и другие положения, позволяющие вам удалить все оценки ученика или класса, если ученик или класс удаляются.

Отношение между учениками и классами называется отношением «многие ко многим».Это означает, что многие ученики могут быть назначены одному классу, а многие классы могут быть назначены одному ученику.Не то чтобы единственными ключами, которые являются автоматическими приращениями, являются идентификаторы ученика и класса.Идентификаторы в файле оценок ссылаются на соответствующие строки ученика и класса.В приведенном выше примере данных у Генри есть оценки по двум классам (История Огайо (98) и История США (85)), у Молли есть оценки только по одному классу (Всемирная история (85)), а у Джорджа есть оценки по двум классам (США).История (77) и Всемирная история (92)).

Вы можете создать единое представление, объединяющее классы учащихся и оценки следующим образом:

create view if not exists student_view (
  last_name, first_name, class_name, point_grade, letter_grade)
as (
  select last_name, first_name, name, point_grade, letter_grade
    from students
      join grades on grades.student_id = students.id
      join classes on classes.id = grades.class_id;
...