数据库产生外键结果不正确的问题

时间:2019-03-24 18:33:41

标签: android sqlite

我目前正在尝试通过Android Studio项目中的接口实现从数据库中添加,编辑,更新和删除信息的方法,当涉及到没有外键的表时,我现在可以正确添加它。

我遇到的问题是当我尝试使用具有外键的表将数据添加到数据库中时。

我将通过估算相关信息以及外键ID来实现此目的。但是,这样做时,它会随机更改我插入ID的任何ID:2131165349。我不确定此ID的来源,并且该ID在外键最初所在的表中不存在。

我相信我的问题在于我用来创建表的代码中参考了我如何创建具有主键的表。

下面是我的onCreate方法的代码。

public void onCreate(SQLiteDatabase sqLiteDatabase) {
    String sqlBook = "CREATE TABLE book(id INTEGER PRIMARY KEY AUTOINCREMENT, bookName VARCHAR, bookAuthor VARCHAR);";
    String sqlChapter = "CREATE TABLE chapter(id INTEGER PRIMARY KEY AUTOINCREMENT, chapterName VARCHAR, book_id INTEGER, FOREIGN KEY(book_id) REFERENCES book(id))";
    String sqlSection ="CREATE TABLE section(id INTEGER PRIMARY KEY AUTOINCREMENT, sectionName VARCHAR, sectionInfo VARCHAR, book_id INTEGER, chapter_id INTEGER, FOREIGN KEY(book_id) REFERENCES book(id), FOREIGN KEY (chapter_id) REFERENCES chapter(id))";

    sqLiteDatabase.execSQL(sqlBook);
    sqLiteDatabase.execSQL(sqlChapter);
    sqLiteDatabase.execSQL(sqlSection);

AddChapterActivity

public class AddChapterActivity extends AppCompatActivity {

DatabaseHelper db;
Button btnAddChapter, btnViewChapter, btnUpdateChapter, btnDeleteChapter;
EditText textEditChapterName, textEditBookID, textEditChapterID;



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

    db = new DatabaseHelper(this);
    btnAddChapter = findViewById(R.id.btnAddChapter);
    btnViewChapter = findViewById(R.id.btnViewChapter);
    btnUpdateChapter = findViewById(R.id.btnUpdateChapter);
    btnDeleteChapter = findViewById(R.id.btnDeleteChapter);
    textEditBookID = findViewById(R.id.textEditBookID);
    textEditChapterName = findViewById(R.id.textEditChapterName);
    textEditChapterID = findViewById(R.id.textEditChapterID);
    addChapter();
}
  public void addChapter(){
    btnAddChapter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String chapterName = textEditChapterName.getText().toString();
            int book_id =  textEditBookID.getId();

            boolean insertChapter = db.addChapter(chapterName, book_id);

            if(insertChapter == true) {
                Toast.makeText(AddChapterActivity.this, "Chapter added successfully!", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(AddChapterActivity.this, "Something went wrong.", Toast.LENGTH_LONG).show();
            }
        }
    });
        }

数据库帮助器

    public boolean addChapter(String chapterName, Integer book_id){
    SQLiteDatabase db = getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("chapterName", chapterName);
    contentValues.put("book_id", book_id);
    long result = db.insert("chapter", null, contentValues);
        if(result == -1) {
            return false;
        }else{
            return true;
        }

1 个答案:

答案 0 :(得分:1)

onClick()类的侦听器的AddChapterActivity方法中,更改以下行:

int book_id =  textEditBookID.getId();

使用

int book_id =  Integer.parseInt(textEditBookID.getText().toString());

您得到的是EditText的{​​{1}},而不是代码中的文本。
我想(按名称)您在id中有这本书的ID,对吧?