gpt4 book ai didi

java - 如何在 SQLite 中使用外键插入值?

转载 作者:行者123 更新时间:2023-12-01 18:16:06 27 4
gpt4 key购买 nike

我是 Android Sqlite 数据库的新手。我在Android中使用SQLite创建了一个数据库,并且有一个表Student_details,它使用表的外键:Student,我已将id设置为AUTOINCRMENT 。我尝试从 Student返回AUTOINCRMENT Id 的值。

但我坚持使用返回值作为外键值插入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");
}
}

最佳答案

我将回答有关数据库的一般问题,而不是专门讨论 Sqlite 或其在 Android 中的用法。

因此,您有学生的姓名(不是主键),但您需要将该学生的一些附加数据保存到另一个表中。步骤是:

  1. 执行 SELECT id FROM Students WHERE name = ? 以查找相关标识符。
  2. 使用检索到的 id 作为键,对辅助表执行 INSERT INTO Student_details

额外提示:

  1. 名称不是一个好的唯一标识符。多定义一个标准是件好事 - 例如群组名称、群组编号甚至出生日期。
  2. 当您的数据库足够大时,您可能会受益于搜索条件的索引来优化第一个查询的执行。但客户端(应用内)数据库通常并非如此。
  3. 这里我们假设 name 不是可以在搜索 id 和执行 INSERT 之间被其他人(或其他东西)更新的数据。否则,明智的做法是使用事务并“锁定”您的学生,直到您完成更新。

关于java - 如何在 SQLite 中使用外键插入值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60364847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com