Как объединить таблицы в SQLite Android Studio - PullRequest
0 голосов
/ 30 мая 2018

В моей базе данных SQLite создано три таблицы для ограничения избыточности.Я понимаю, что эти методы немного отстают, но это были требования для такого назначения.Таблицы создаются следующим образом:

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

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

Спасибо!

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

    ContentValues contentValues2 = new ContentValues();
            contentValues2.put("classid", classid.getText().toString());
            contentValues2.put("classname", classname.getText().toString());
            long result2 = db.insertWithOnConflict("CLASS_TABLE", "classid", contentValues2, SQLiteDatabase.CONFLICT_IGNORE);

РЕДАКТИРОВАТЬ, вот все «Добавить»

 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;
            }


            ContentValues contentValues = new ContentValues();
            contentValues.put("studentid", studentid.getText().toString());
            contentValues.put("fname", fname.getText().toString());
            contentValues.put("lname", lname.getText().toString());
            long result =  db.insertWithOnConflict("STUDENT_TABLE", "studentid", contentValues, SQLiteDatabase.CONFLICT_IGNORE);

            if (result == -1) {
                showMessage("Error", "This Name Data entry already exists");
            }


            ContentValues contentValues2 = new ContentValues();
            contentValues2.put("classid", classid.getText().toString());
            contentValues2.put("classname", classname.getText().toString());
            long result2 = db.insertWithOnConflict("CLASS_TABLE", "classid", contentValues2, SQLiteDatabase.CONFLICT_IGNORE);


            if (result2 == -1) {
                showMessage("Error", "This Class Data entry already exists");
            }

            ContentValues contentValues3 = new ContentValues();
            contentValues3.put("studentid", studentid.getText().toString());
            contentValues3.put("classid", classid.getText().toString());
            contentValues3.put("pointgrade", pointgrade.getText().toString());
            contentValues3.put("lettergrade", lettergrade.getText().toString());
            long result3 =   db.insertWithOnConflict("GRADE_TABLE", "studentid", contentValues3, SQLiteDatabase.CONFLICT_IGNORE);

            if (result3 == -1) {
                showMessage("Error", "This Grade Data entry already exists");
            }

            if (result != -1 && result2 != -1 && result3 != -1)
                showMessage("Success", "Student Record added successfully");

            clearText();


        }
    });

УДАЛИТЬ ФУНКЦИЮ:

 delete.setOnClickListener(new OnClickListener() {

        Cursor csr = db.query("GRADE_TABLE JOIN STUDENT_TABLE ON STUDENT_TABLE.studentid = GRADE_TABLE.studentid JOIN CLASS_TABLE ON CLASS_TABLE.classid = GRADE_TABLE.classid",null,null,null,null,null,null);

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(studentid.getText().toString().trim().length()==0 || classid.getText().toString().trim().length()==0)
            {
                showMessage("Error", "Please enter Student and Class ID ");
                return;
            }
            Cursor csr=db.rawQuery("SELECT * FROM GRADE_TABLE WHERE studentid='"+studentid.getText()+"' AND classid='"+classid.getText()+"'", null);
            if(c.moveToFirst())
            {
                db.execSQL("DELETE FROM GRADE_TABLE WHERE studentid='"+studentid.getText()+"' AND classid='"+studentid.getText()+"'");
                showMessage("Success", "Record Deleted");
            }
            else
            {
                showMessage("Error", "Invalid First and Last Name or Student ID");
            }
            clearText();
        }
    });

1 Ответ

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

Я бы предположил, что ваша схема будет вызывать у вас следующие проблемы: -

  • CLASS_TABLE будет разрешать только одного ученика в классе, как и другиекроме идентификатора учащегося другие столбцы имеют ограничение UNIQUE.

  • GRADE_TABLE вводит избыточность, а не ограничивает ее, сохраняя имя класса.

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

Я бы предложил слегка изменить схему, например: -

CREATE TABLE IF NOT EXISTS STUDENT_TABLE (studentid TEXT, fname TEXT, lname TEXT);
CREATE TABLE IF NOT EXISTS CLASS_TABLE(classid TEXT PRIMARY KEY, classname TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS GRADE_TABLE (studentid TEXT, classid TEXT, pointgrade INTEGER, lettergrade TEXT);

Допустим, вы использовали следующее для вставкинекоторые данные: -

INSERT INTO STUDENT_TABLE 
    VALUES('00001','Fred','Smith'),('00010','Mary','Thomas'),('00910','Angela','Jones')
;

INSERT INTO CLASS_TABLE VALUES('001','English'),('101','Mathematics'),('201','Chemistry');

INSERT INTO GRADE_TABLE VALUES
    ('00001','001',99,'A'), -- Fred Smith has 99 point grade as an A in English
    ('00001','101',25,'F'), -- Fred Smith has 25 point grade as an F on Mathematics
    ('00010','201',76,'B'), -- Angela Jones 76 a B in Chemistry
    ('00910','101',50,'C'), 
    ('00910','201',63,'C'),
    ('00910','001',89,'A')
;

Результирующие таблицы будут: -

STUDENT_TABLE : -

enter image description here

CLASS_TABLE : -

enter image description here

GRADE_TABLE

enter image description here

Затем вы можете делать магию с помощью соединений, скажем, для составления списка общих баллов учащихся (все баллы за каждого учащегося добавляются за все их классы) вместе с классами, в которых они находятся, например: -

SELECT fname,
    lname, 
    sum(pointgrade) AS overallgrade, 
    group_concat(classname,' - ') AS classes
FROM GRADE_TABLE 
    JOIN STUDENT_TABLE ON GRADE_TABLE.studentid = STUDENT_TABLE.studentid
    JOIN CLASS_TABLE ON GRADE_TABLE.classid = CLASS_TABLE.classid
GROUP BY STUDENT_TABLE.studentid
ORDER BY overallgrade DESC
;

, что приведет к: -

enter image description here

  • Примечание sum и group_contact - агрегатные функции, объясненные в SQL в понимании SQLite - агрегатные функции , они будут работать с результатами GROUPED .
    • Если нет GROUP BY , вы получите ** 1 * результирующую строку для всех строк.
    • Однако, если используется GROUP BY STUDENT_TABLE.studentid, то результат возвращается для каждой GROUP , т.е. студент
    • note GROUP BY GRADE_TABLE.studentid будет иметь тот же результат.

Чтобы полностью ответить на ваш вопрос, но с предложенной схемой, следующий SQL-код будет соответственно присоединен: -

SELECT 
    STUDENT_TABLE.studentid, 
    fname, 
    lname, 
    CLASS_TABLE.classid, 
    classname, 
    pointgrade, 
    lettergrade
FROM GRADE_TABLE 
    JOIN STUDENT_TABLE ON STUDENT_TABLE.studentid = GRADE_TABLE.studentid
      JOIN CLASS_TABLE ON  CLASS_TABLE.classid = GRADE_TABLE.classid;

Это приведет к следующему: -

enter image description here

На основе исходного кода и предлагаемой схемы и использования класса, доступных здесь Существуют ли какие-либо методы, помогающие разрешить общий SQLite?проблемы?

ПРИМЕЧАНИЕ приведенный выше код будет работать только один раз, так как последующие запуски приведут к УНИКАЛЬНЫМ конфликтам ограничений (иначе - вы не можете добавить повторяющиеся строки в CLASS_TABLE)

Следующий код: -

    SQLiteDatabase db;
    db=openOrCreateDatabase("STUDENTGRADES", Context.MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS STUDENT_TABLE (studentid TEXT, fname TEXT, lname TEXT)");
    db.execSQL("CREATE TABLE IF NOT EXISTS CLASS_TABLE(classid TEXT PRIMARY KEY, classname TEXT UNIQUE)");
    db.execSQL("CREATE TABLE IF NOT EXISTS GRADE_TABLE (studentid TEXT, classid TEXT, pointgrade INTEGER, lettergrade TEXT)");
    db.execSQL("INSERT INTO STUDENT_TABLE \n" +
            "    VALUES('00001','Fred','Smith'),('00010','Mary','Thomas'),('00910','Angela','Jones')"
    );
    db.execSQL("INSERT INTO CLASS_TABLE VALUES('001','English'),('101','Mathematics'),('201','Chemistry');");
    db.execSQL("INSERT INTO GRADE_TABLE VALUES\n" +
            "    ('00001','001',99,'A'), -- Fred Smith has 99 point grade as an A in English\n" +
            "    ('00001','101',25,'F'), -- Fred Smith has 25 point grade as an F on Mathematics\n" +
            "    ('00010','201',76,'B'), -- Angela Jones 76 a B in Chemistry\n" +
            "    ('00910','101',50,'C'), \n" +
            "    ('00910','201',63,'C'),\n" +
            "    ('00910','001',89,'A')\n" +
            ";");
    Cursor csr = db.query("GRADE_TABLE JOIN STUDENT_TABLE ON STUDENT_TABLE.studentid = GRADE_TABLE.studentid JOIN CLASS_TABLE ON CLASS_TABLE.classid = GRADE_TABLE.classid",null,null,null,null,null,null);
    CommonSQLiteUtilities.logDatabaseInfo(db);
    CommonSQLiteUtilities.logCursorData(csr);
    csr.close();

Результат: -

05-31 04:20:32.605 3582-3582/? D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/cpa.carpurchases/databases/STUDENTGRADES
    Database Version = 0
    Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
    Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table Name = STUDENT_TABLE Created Using = CREATE TABLE STUDENT_TABLE (studentid TEXT, fname TEXT, lname TEXT)
    Table = STUDENT_TABLE ColumnName = studentid ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = STUDENT_TABLE ColumnName = fname ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = STUDENT_TABLE ColumnName = lname ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table Name = CLASS_TABLE Created Using = CREATE TABLE CLASS_TABLE(classid TEXT PRIMARY KEY, classname TEXT UNIQUE)
    Table = CLASS_TABLE ColumnName = classid ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 1
    Table = CLASS_TABLE ColumnName = classname ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table Name = GRADE_TABLE Created Using = CREATE TABLE GRADE_TABLE (studentid TEXT, classid TEXT, pointgrade INTEGER, lettergrade TEXT)
    Table = GRADE_TABLE ColumnName = studentid ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = GRADE_TABLE ColumnName = classid ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = GRADE_TABLE ColumnName = pointgrade ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = GRADE_TABLE ColumnName = lettergrade ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
05-31 04:20:32.609 3582-3582/? D/SQLITE_CSU: logCursorData Cursor has 12 rows with 9 columns.
    Information for row 1 offset=0
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column pointgrade Type is INTEGER value as String is 99 value as long is 99 value as double is 99.0
        For Column lettergrade Type is STRING value as String is A value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column fname Type is STRING value as String is Fred value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Smith value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column classname Type is STRING value as String is English value as long is 0 value as double is 0.0
    Information for row 2 offset=1
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column pointgrade Type is INTEGER value as String is 99 value as long is 99 value as double is 99.0
        For Column lettergrade Type is STRING value as String is A value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column fname Type is STRING value as String is Fred value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Smith value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column classname Type is STRING value as String is English value as long is 0 value as double is 0.0
    Information for row 3 offset=2
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column pointgrade Type is INTEGER value as String is 25 value as long is 25 value as double is 25.0
        For Column lettergrade Type is STRING value as String is F value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column fname Type is STRING value as String is Fred value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Smith value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column classname Type is STRING value as String is Mathematics value as long is 0 value as double is 0.0
05-31 04:20:32.621 3582-3584/? D/dalvikvm: GC_CONCURRENT freed 338K, 11% free 6233K/6983K, paused 10ms+0ms, total 12ms
05-31 04:20:32.621 3582-3582/? D/SQLITE_CSU: Information for row 4 offset=3
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column pointgrade Type is INTEGER value as String is 25 value as long is 25 value as double is 25.0
        For Column lettergrade Type is STRING value as String is F value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00001 value as long is 1 value as double is 1.0
        For Column fname Type is STRING value as String is Fred value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Smith value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column classname Type is STRING value as String is Mathematics value as long is 0 value as double is 0.0
    Information for row 5 offset=4
        For Column studentid Type is STRING value as String is 00010 value as long is 8 value as double is 10.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column pointgrade Type is INTEGER value as String is 76 value as long is 76 value as double is 76.0
        For Column lettergrade Type is STRING value as String is B value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00010 value as long is 8 value as double is 10.0
        For Column fname Type is STRING value as String is Mary value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Thomas value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column classname Type is STRING value as String is Chemistry value as long is 0 value as double is 0.0
    Information for row 6 offset=5
        For Column studentid Type is STRING value as String is 00010 value as long is 8 value as double is 10.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column pointgrade Type is INTEGER value as String is 76 value as long is 76 value as double is 76.0
        For Column lettergrade Type is STRING value as String is B value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00010 value as long is 8 value as double is 10.0
        For Column fname Type is STRING value as String is Mary value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Thomas value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column classname Type is STRING value as String is Chemistry value as long is 0 value as double is 0.0
    Information for row 7 offset=6
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column pointgrade Type is INTEGER value as String is 50 value as long is 50 value as double is 50.0
        For Column lettergrade Type is STRING value as String is C value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column classname Type is STRING value as String is Mathematics value as long is 0 value as double is 0.0
05-31 04:20:32.637 3582-3584/? D/dalvikvm: GC_CONCURRENT freed 409K, 12% free 6226K/7047K, paused 11ms+0ms, total 13ms
05-31 04:20:32.637 3582-3582/? D/SQLITE_CSU: Information for row 8 offset=7
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column pointgrade Type is INTEGER value as String is 50 value as long is 50 value as double is 50.0
        For Column lettergrade Type is STRING value as String is C value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 101 value as long is 101 value as double is 101.0
        For Column classname Type is STRING value as String is Mathematics value as long is 0 value as double is 0.0
    Information for row 9 offset=8
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column pointgrade Type is INTEGER value as String is 63 value as long is 63 value as double is 63.0
        For Column lettergrade Type is STRING value as String is C value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column classname Type is STRING value as String is Chemistry value as long is 0 value as double is 0.0
    Information for row 10 offset=9
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column pointgrade Type is INTEGER value as String is 63 value as long is 63 value as double is 63.0
        For Column lettergrade Type is STRING value as String is C value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 201 value as long is 201 value as double is 201.0
        For Column classname Type is STRING value as String is Chemistry value as long is 0 value as double is 0.0
    Information for row 11 offset=10
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column pointgrade Type is INTEGER value as String is 89 value as long is 89 value as double is 89.0
        For Column lettergrade Type is STRING value as String is A value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column classname Type is STRING value as String is English value as long is 0 value as double is 0.0
    Information for row 12 offset=11
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column pointgrade Type is INTEGER value as String is 89 value as long is 89 value as double is 89.0
        For Column lettergrade Type is STRING value as String is A value as long is 0 value as double is 0.0
        For Column studentid Type is STRING value as String is 00910 value as long is 0 value as double is 910.0
        For Column fname Type is STRING value as String is Angela value as long is 0 value as double is 0.0
        For Column lname Type is STRING value as String is Jones value as long is 0 value as double is 0.0
        For Column classid Type is STRING value as String is 001 value as long is 1 value as double is 1.0
        For Column classname Type is STRING value as String is English value as long is 0 value as double is 0.0

Дополнительный повторяющийся класс

Следующий код расширяет приведенное выше, добавляя новыйстудент, который будет зачислен в класс 001 - английский (который уже существует), используя: -

    ContentValues cv = new ContentValues();
    String studentid = "00002";
    String fname = "Bert";
    String lname = "Jones";
    String classid = "001";
    String classname = "English";
    int pointgrade = 56;
    String lettergrade = "C";

    cv.put("studentid",studentid);
    cv.put("fname",fname);
    cv.put("lname",lname);
    if (db.insert("STUDENT_TABLE",null,cv) > 0) {
        cv.clear();
        cv.put("classid",classid);
        cv.put("classname",classname);
        if (db.insert("CLASS_TABLE",null,cv) > 0) {
            Log.d(
                    "CLASSADD",
                    "Class " +
                            cv.getAsString("classid") +
                            " - " +
                            cv.getAsString("classname") +
                            " ADDED."
            );
        } else {
            Log.d(
                    "CLASSADD",
                    "Class " +
                            cv.getAsString(
                                    "classid") +
                            " - " +
                            cv.getAsString("classname") +
                            " NOT ADDED (Exists)"
            );
        }
        cv.clear();
        cv.put("studentid",studentid);
        cv.put("classid",classid);
        cv.put("pointgrade",pointgrade);
        cv.put("lettergrade",lettergrade);
        if (db.insert("GRADE_TABLE",null,cv) > 0) {
            Log.d("ENROLRESULT",
                    "Student " +
                            cv.getAsString("studentid") +
                            " - " +
                            cv.getAsString("fname") +
                            " " +
                            cv.getAsString("lname")
                            + " pointgrade " +
                            String.valueOf(cv.getAsInteger("pointgrade")) +
                            " lettergrade " +
                            cv.getAsString("lettergrade") +
                            " ENROLLED"
            );
        }
    }

This: -

  1. Попытки добавить (вставить) нового студента.
  2. Если ученик не был добавлен, то больше ничего не делается.
  3. В противном случае: -
    1. Попытки добавить (вставить) класс (001 - английский), который уже существует, используянормальный метод insert (SQL будет INSERT ИЛИ IGNORE INTO CLASS_TABLE .....).
    2. Регистрирует сообщение, указывающее, добавлен он или нет <<<< Важный бит </li>
    3. Добавляет соответствующийGRADE_TABLE строка

Выполнение вышеуказанных проблем приводит к следующемузаписывает в журнал: -

05-31 08:13:43.557 4476-4476/? D/CLASSADD: Class 001 - English NOT ADDED (Exists)
05-31 08:13:43.565 4476-4476/? D/ENROLRESULT: Student 00002 - null null pointgrade 56 lettergrade C ENROLLED

Приложение не падает.

Однако журнал также включает : -

05-31 08:13:43.557 4476-4476/? E/SQLiteDatabase: Error inserting classname=English classid=001
    android.database.sqlite.SQLiteConstraintException: column classname is not unique (code 19)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
        at cpa.carpurchases.MainActivity.onCreate(MainActivity.java:99)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
  • Обратите внимание на отсутствие ИСТОЧНОГО ИСКЛЮЧЕНИЯ ИСКЛЮЧЕНИЯ
  • Обратите внимание на временные метки
    • не удается вставить @
    • 05-31 08:13: 43,557
    • но сообщает о регистрации @
    • 05-31 08: 13: 43,565

В основном SQLite insert перехватил ошибку, позволяющую продолжить обработку, но напечатал трассировку стека (возможно, не следует, возможно, следует)

...