Внешние ключи дочерней таблицы автоматически заполняются теми же значениями из первичного ключа родительской таблицы - PullRequest
0 голосов
/ 03 апреля 2019

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

Я создаю эти таблицы и базу данных для своего приложения для Android в Android Studio и использую sqlite3.

CREATE TABLE table1(
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name VARCHAR, 
    fathername VARCHAR,
    dob DATE, 
    age INT 
);

CREATE TABLE table2(
    m_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    treatdate DATE, 
    hospital VARCHAR,
    city VARCHAR, 
    id2 INT,
    FOREIGN KEY (id2) REFERENCES table1(id) 
);

1 Ответ

0 голосов
/ 04 апреля 2019

Если вы используете метод SQLiteDatabse insert , он возвращает rowid в строке вставки (для таблиц, которые не определены без WOWHOUT ROWID).Поскольку вы использовали INTEGER PRIMARY KEY для определения столбца id , это псевдоним столбца rowid , поэтому будет возвращено значение, присвоенное id (если столбец был успешно вставлен, иначе возвращается -1).

например,

ContentValues cv = new ContentValues();
cv.put("name","Fred");
cv.put("fathername","George");
cv.put("dob","2000-01-01");
cv.put("age",21)
long returned_id = your_sqlite_database.insert("table1",null,cv);

return_id будет идентификатором строки, вставленной в table1.

Как правило, вышеприведенное относится к методу, который принимает имя, имя отца, dob и age в качестве параметров и возвращает идентификатор.

Рабочий пример

Помощник по базам данных (подкласс SQLiteOpenHelper) DBHelper.java

Это создает базу данных и таблицы и определяет 3 метода: -

  • addTable1Row для добавления строки вtable1, которая возвращает long с идентификатором вставленной строки.
  • addTable2Row чтобы добавить строку в table2, которая возвращает long с идентификатором вставленной строки
  • getAllFromTable1JoinedWithTable2 делает как яэто имя подразумевает

  • Примечание метод onConfigure SQLiteOpenHelper переопределяется для включения поддержки внешнего ключа (по умолчанию он не включен)

: -

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;

    public static final String TBL_TABLE1 = "table1";
    public static final String TBL_TABLE2 = "table2";

    public static final String COL_TABLE1_ID = "id";
    public static final String COL_TABLE1_NAME = "name";
    public static final String COL_TABLE1_FATHERNAME = "fathername";
    public static final String COL_TABLE1_DOB = "dob";
    public static final String COL_TABLE1_AGE = "age";

    public static final String COL_TABLE2_ID = "m_id";
    public static final String COL_TABLE2_TREATDATE = "treatdate";
    public static final String COL_TABLE2_HOSPITAL = "hospital";
    public static final String COL_TABLE2_CITY = "city";
    public static final String COL_TABLE2_ID2 = "id2";

    SQLiteDatabase mDB;

    public DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String table1_crtsql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE1 + "(" +
                COL_TABLE1_ID + " INTEGER PRIMARY KEY, " +
                COL_TABLE1_NAME + " TEXT, " +
                COL_TABLE1_FATHERNAME + " TEXT, " +
                COL_TABLE1_DOB + " TEXT, " +
                COL_TABLE1_AGE + " INTEGER" +
                ")";
        db.execSQL(table1_crtsql);

        String table2_crtsql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE2 + "(" +
                COL_TABLE2_ID + " INTEGER PRIMARY KEY, " +
                COL_TABLE2_TREATDATE + " TEXT, " +
                COL_TABLE2_HOSPITAL + " TEXT, " +
                COL_TABLE2_CITY + " TEXT, " +
                COL_TABLE2_ID2 + " INTEGER REFERENCES " + TBL_TABLE1 + "(" + COL_TABLE1_ID + ")" +
                ")";
        db.execSQL(table2_crtsql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
        db.setForeignKeyConstraintsEnabled(true);
    }

    public long addTable1Row(String name, String fathername, String dob, int age) {
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE1_NAME,name);
        cv.put(COL_TABLE1_FATHERNAME,fathername);
        cv.put(COL_TABLE1_DOB,dob);
        cv.put(COL_TABLE1_AGE,age);
        return mDB.insert(TBL_TABLE1,null,cv);
    }

    public long addTable2Row(String treatdate, String hospital, String city, long table1_reference) {
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE2_TREATDATE,treatdate);
        cv.put(COL_TABLE2_HOSPITAL,hospital);
        cv.put(COL_TABLE2_CITY,city);
        cv.put(COL_TABLE2_ID2,table1_reference);
        return mDB.insert(TBL_TABLE2,null,cv);
    }

    public Cursor getAllFromTable1JoinedWithTable2() {
        String tables = TBL_TABLE1 +
                " JOIN " + TBL_TABLE2 +
                " ON " +
                TBL_TABLE2 + "." + COL_TABLE2_ID2 +
                " = " +
                TBL_TABLE1 + "." + COL_TABLE1_ID;
        return mDB.query(tables,null,null,null,null,null,null);
    }
}
  • Примечание AUTOINCREMENT не использовалось, так как оно является ненужным, использовались определенные типы столбцов, а не производные типы столбцов (не то, чтобы это оказало какое-либо влияние)

MainActivity.java

Это создает объекты DBHelper, а затем использует доступные методы для добавления некоторых строк в каждую из таблиц.2 строки добавляются в таблицу 1, а 3 добавляются в таблицу 2 (Фред имеет 2 посещения больницы).

Затем данные извлекаются в соответствии с отношением между таблицей 2 и таблицей 1, поэтому извлекаются 3 строки.Они выгружаются в системный журнал.

public class MainActivity extends AppCompatActivity {

    DBHelper mDBhlpr;

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

        mDBhlpr = new DBHelper(this);

        //Add Fred
        long parentid = mDBhlpr.addTable1Row("Fred","George","2000-01-01",19);
        // Add a hospital visit for Fred
        mDBhlpr.addTable2Row("2019-01-01","Prince Fred","Timbukto",parentid);

        //Add Mary and a hospital visit all in one go
        mDBhlpr.addTable2Row("2019-01-02","St Barts","Springfield",
                mDBhlpr.addTable1Row("Mary","Tom","1999-12-23",19)
        );

        // Another hospital visit for Fred
        mDBhlpr.addTable2Row("2019-01-03","John Radcliffe","Oxford",parentid);

        // Get the joined data and dump it to the log
        Cursor csr = mDBhlpr.getAllFromTable1JoinedWithTable2();
        DatabaseUtils.dumpCursor(csr);
    }
}

Результат

Журнал включает в себя: -

 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@3fd1bbe9
 I/System.out: 0 {
 I/System.out:    id=1
 I/System.out:    name=Fred
 I/System.out:    fathername=George
 I/System.out:    dob=2000-01-01
 I/System.out:    age=19
 I/System.out:    m_id=1
 I/System.out:    treatdate=2019-01-01
 I/System.out:    hospital=Prince Fred
 I/System.out:    city=Timbukto
 I/System.out:    id2=1
 I/System.out: }
 I/System.out: 1 {
 I/System.out:    id=2
 I/System.out:    name=Mary
 I/System.out:    fathername=Tom
 I/System.out:    dob=1999-12-23
 I/System.out:    age=19
 I/System.out:    m_id=2
 I/System.out:    treatdate=2019-01-02
 I/System.out:    hospital=St Barts
 I/System.out:    city=Springfield
 I/System.out:    id2=2
 I/System.out: }
 I/System.out: 2 {
 I/System.out:    id=1
 I/System.out:    name=Fred
 I/System.out:    fathername=George
 I/System.out:    dob=2000-01-01
 I/System.out:    age=19
 I/System.out:    m_id=3
 I/System.out:    treatdate=2019-01-03
 I/System.out:    hospital=John Radcliffe
 I/System.out:    city=Oxford
 I/System.out:    id2=1
 I/System.out: }
 I/System.out: <<<<<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...