Как вставить значения с иностранным ключом в SQLite? - PullRequest
0 голосов
/ 23 февраля 2020

Я новичок с Android База данных Sqlite . Я создал базу данных с SQLite в Android, и у меня есть таблица Student_details, которая использует внешний ключ таблицы: Student, я сделал идентификатор как AUTOINCREMENT. И я попытался вернуть значение AUTOINCREMENT Id из Student таблицы.

Но я застрял, чтобы использовать return values для вставки в COLUMN_FR_KEY_USER_ID = "student_id"; в качестве значений внешнего ключа.

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

DatabaseHelper. java

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "finalStudent.db";
    private static final int VERSION_NUMBER = 16;
    private static final String TABLE_STUDENT = "Student";
    private static final String TABLE_DETAILS_NAME = "Student_details";

    private static final String COLUMN_STUDENT_ID = "id";
    private static final String COLUMN_DETAILS_ID = "id";
    private static final String COLUMN_FR_KEY_USER_ID = "student_id";
    private static final String COLUMN_STUDENT_NAME = "name";
    private static final String COLUMN_DETAILS_NAME = "name";
    private static final String COLUMN_STUDENT_EMAIL = "email";
    private static final String COLUMN_STUDENT_PASSWORD = "password";

    private static final String CREATE_STUDENT_TABLE = "CREATE TABLE "+TABLE_STUDENT+"( "+COLUMN_STUDENT_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+COLUMN_STUDENT_NAME+" TEXT, "+COLUMN_STUDENT_EMAIL+" TEXT, "+COLUMN_STUDENT_PASSWORD+" TEXT)";
    private static final String CREATE_DETAILS_TABLE = "CREATE TABLE "+TABLE_DETAILS_NAME+"( "+COLUMN_DETAILS_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+COLUMN_DETAILS_NAME+" TEXT, "+COLUMN_FR_KEY_USER_ID+" INTEGER, FOREIGN KEY("+COLUMN_FR_KEY_USER_ID+") REFERENCES "+TABLE_STUDENT+" ("+COLUMN_STUDENT_ID+") ON UPDATE CASCADE ON DELETE CASCADE)";

    private Context context;
    private static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_STUDENT;
    private static final String DROP_DETAILS_TABLE = "DROP TABLE IF EXISTS "+TABLE_DETAILS_NAME;


    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION_NUMBER);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            Toast.makeText(context,"Table created successfully and called onCreate method",Toast.LENGTH_SHORT).show();
            db.execSQL(CREATE_STUDENT_TABLE);
            db.execSQL(CREATE_DETAILS_TABLE);
        }catch (Exception e){
            Toast.makeText(context,"Exception : "+e,Toast.LENGTH_SHORT).show();
        }
    }

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

            Toast.makeText(context,"Table created successfully and called onCreate method",Toast.LENGTH_SHORT).show();
            db.execSQL(DROP_TABLE);
            db.execSQL(DROP_DETAILS_TABLE);
            onCreate(db);
        }catch (Exception e){
            Toast.makeText(context,"Exception : "+e,Toast.LENGTH_SHORT).show();
        }

    }

    public long insertDataIntoStudent( String name, String email, String password){
        // to write or read data in database , we have to call getWritableDatabase
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        // we have to call contentValues class to store data in the data

        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_STUDENT_NAME,name);
        contentValues.put(COLUMN_STUDENT_EMAIL,email);
        contentValues.put(COLUMN_STUDENT_PASSWORD,password);

        // Insert the new row, returning the primary key value of the new row
        long newRowId = sqLiteDatabase.insert(TABLE_STUDENT,null,contentValues);
        return newRowId;
    }


    public void insetDataIntoStudentDetails(String name){

        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
       // TODO: insert the foreign key's value 
        contentValues.put(name,name);
    }


    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        //enable foreign key constraints like ON UPDATE CASCADE, ON DELETE CASCADE
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
}

MainActivity. java

public class MainActivity extends AppCompatActivity {

    private final AppCompatActivity activity = MainActivity.this;
    DatabaseHelper databaseHelper;

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

        databaseHelper = new DatabaseHelper(activity);
        databaseHelper.insertDataIntoStudent("Bappy","abcd@gmail.com","145456");
    }
    }

1 Ответ

0 голосов
/ 23 февраля 2020

Я отвечу о базах данных в целом, а не о Sqlite или его использовании в Android.

Итак, у вас есть имя студента (не первичный ключ), но вам нужно сохранить некоторые дополнительные данные для этого студента в другую таблицу. Шаги:

  1. Выполните SELECT id FROM students WHERE name = ?, чтобы найти соответствующий идентификатор.
  2. Выполните INSERT INTO student_details для вашей дополнительной таблицы, используя извлеченный id в качестве ключа.

Дополнительные советы:

  1. Имя не является хорошим уникальным идентификатором. Хорошо иметь еще один критерий - например, имя группы, номер группы или даже дату рождения.
  2. Когда ваша база данных достаточно велика, вы можете воспользоваться index для критериев поиска, чтобы оптимизировать выполнение первый запрос. Но обычно это не относится к базам данных на стороне клиента (* в приложении).
  3. Здесь мы предполагаем, что имя - это не те данные, которые могут быть обновлены кем-то (или чем-то еще) между поиском id и выполнение INSERT. В противном случае целесообразно использовать транзакцию и «блокировать» вашего учащегося, пока вы не завершите обновления.
...