Добавление элементов во вторую таблицу SQLite в Android Studio ничего не делает - PullRequest
0 голосов
/ 11 мая 2018

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

Это мой DatabaseHelper.java:

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " ( " + COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 + " TEXT);";

    String createTable2 = "CREATE TABLE " + TABLE_NAME2 + " ( " + COL3 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL4 + " TEXT,"
            + COL5 + " INTEGER," + COL1 + " INTEGER PRIMARY KEY," + COL6 + " TEXT, " + " FOREIGN KEY (" + COL1 + ") REFERENCES "
            + TABLE_NAME + "(" + COL1 + "));";

    db.execSQL(createTable);
    db.execSQL(createTable2);
}

public boolean addData2(String newEntry1, String newEntry2, String horarios, Integer id_ppl) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL4, newEntry1);
    contentValues.put(COL5, newEntry2);
    contentValues.put(COL1, id_ppl);
    contentValues.put(COL6, horarios);


    long result = db.insert(TABLE_NAME2, null, contentValues);

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

Это мой mainactivity.java

buttonNewPill.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String newEntry1 = editText2.getText().toString();
            String newEntry2 = editText3.getText().toString();
            String textSp1 = spinner2.getSelectedItem().toString();
            String textSp2 = spinner3.getSelectedItem().toString();

            String horario = textSp1 + ":" + textSp2;

            Integer id_ppl = 1;

            Toast.makeText(getApplicationContext(), "horario is "+ horario, Toast.LENGTH_LONG).show();

        /*

            Toast.makeText(getApplicationContext(), "text is "+ textSp, Toast.LENGTH_LONG).show();
        */

            if (editText2.length() > 0 && editText3.length() > 0){

                AddData2(newEntry1, newEntry2, horario, id_ppl);

                editText2.setText("");
                editText3.setText("");

            } else {
                toastMessage("Isn't your field empty?");
            }

        }
    });

private void AddData2(String newEntry1, String newEntry2, String horario, Integer id_ppl) {

    boolean insertData = mDatabaseHelper.addData2(newEntry1, newEntry2, horario, id_ppl);

    if (insertData){
        toastMessage("Data Succesfully entered");
    } else {
        toastMessage("Oops! Something went wrong");
    }

}

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

Большое спасибо за ваше время и помощь в этом вопросе.

1 Ответ

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

Я полагаю, ваша проблема в том, что вы пытаетесь определить несколько ПЕРВИЧНЫХ ИНДЕКСОВ для 2-й таблицы.

То есть у вас есть: -

  • для COL3 INTEGER PRIMARY KEY AUTOINCREMENT
  • для COL1 INTEGER PRIMARY KEY

Вы можете иметь только один ПЕРВИЧНЫЙ ИНДЕКС (вы можете иметь несколько неосновных индексов).

Если бы вы посмотрели журнал, у вас было бы что-то похожее (при первом запуске): -

05-11 01:38:10.133 1215-1215/? E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{soanswers.soanswers/soanswers.soanswers.MainActivity}: android.database.sqlite.SQLiteException: table "tbl002" has more than one primary key (code 1): , while compiling: CREATE TABLE tbl002 ( column3 INTEGER PRIMARY KEY AUTOINCREMENT, column4 TEXT,column5 INTEGER,column1 INTEGER PRIMARY KEY,column6 TEXT,  FOREIGN KEY (column1) REFERENCES tbl001(column1));

Так что при предположении вы захотите: -

String createTable2 = "CREATE TABLE " + TABLE_NAME2 + " ( " + 
    COL3 + " INTEGER PRIMARY KEY, " + 
    COL4 + " TEXT,"
            + 
    COL5 + " INTEGER," + 
    COL1 + " INTEGER," + 
    COL6 + " TEXT, " + 
    " FOREIGN KEY (" + COL1 + ") REFERENCES " + TABLE_NAME + "(" + COL1 + "));";
  • Столбец 1 удален как первичный индекс, хотя вам может потребоваться дополнительный индекс для COL1, так как он ссылается на другую таблицу.
  • Скорее всего, вы действительно не хотите AUTOINCREMENT, согласно

    • Ключевое слово AUTOINCREMENT накладывает дополнительный процессор, память, дисковое пространство и издержки дискового ввода-вывода, и их следует избегать, если в этом нет особой необходимости. это обычно не требуется. Автоинкремент SQLite

Обратите внимание, что вам нужно будет удалить Данные приложения или удалить Приложение (если вы можете позволить себе потерять любые существующие данные) после внесения изменений, чтобы изменения вступили в силу. - Есть и другие способы, но это самый простой.

Добавление индекса (необязательно): -

Следующее добавило бы дополнительный индекс согласно table2 col1: -

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " ( " + COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 + " TEXT);";

    /*
    String createTable2 = "CREATE TABLE " + TABLE_NAME2 + " ( " + COL3 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL4 + " TEXT,"
            + COL5 + " INTEGER," + COL1 + " INTEGER PRIMARY KEY," + COL6 + " TEXT, " + " FOREIGN KEY (" + COL1 + ") REFERENCES "
            + TABLE_NAME + "(" + COL1 + "));";
    */

    String createTable2 = "CREATE TABLE " + TABLE_NAME2 + " ( " +
            COL3 + " INTEGER PRIMARY KEY, " +
            COL4 + " TEXT,"
            +
            COL5 + " INTEGER," +
            COL1 + " INTEGER," +
            COL6 + " TEXT, " +
            " FOREIGN KEY (" + COL1 + ") REFERENCES " + TABLE_NAME + "(" + COL1 + "));";

    String crtTable2Col1Index = "CREATE INDEX IF NOT EXISTS col1index ON " +
            TABLE_NAME2 + "(" + COL1 + ")"; //<<<< ADDED


    db.execSQL(createTable);
    db.execSQL(createTable2);
    db.execSQL(crtTable2Col1Index); //<<<< ADDED
}
  • col1index будет именем индекса

Дополнительно

Обратите внимание, что вы намереваетесь использовать FOREIGN KEYS, вам необходимо включить FOREIGN KEYS (если вы этого не сделали). Вы можете сделать это, переопределив метод onConfigure, например, : -

@Override
public void onConfigure (SQLiteDatabase db) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        db.setForeignKeyConstraintsEnabled(true);
    } else {
        db.execSQL("pragma foreign_keys = ON");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...