0

我有两个非常简单的表,其中一个引用另一个:

 tblBook:
 _id       integer primary key AUTOINCREMENT
 name      text
 publisher text

 tblReader:
 _id       integer primary key AUTOINCREMENT
 name      text
 grade     integer
 bookID    integer references _id(tblBook)

我实现了我的数据库,它工作正常。但是我很确定我的 SQLite 版本不完全支持外键约束,它允许我删除具有一个或多个读者的书(可能有很多读者拥有同一本书)。我要做的就是提示用户,当他想要删除一本书时,所有读者也将被删除,或者他们将被简单地留下没有分配一本书。但是我不知道如何构造我的查询来获取该参考。我认为查询所有读者,将他们的 bookID 放入数组,查询所有书籍并将他们的 id 与读者进行比较似乎效率不高。有什么办法吗?

4

4 回答 4

0

更改您的第二个表如下

_id       integer primary key AUTOINCREMENT
 name      text
 grade     integer
 bookID    integer 
           FOREIGN KEY (bookID) references tblBook (_id)

我希望这能帮到您。试试看。

于 2013-05-09T04:11:45.003 回答
0

你的sql版本是多少?如果你不知道试试这个:

Cursor cursor = SQLiteDatabase.openOrCreateDatabase(":memory:", null).rawQuery("select sqlite_version() AS sqlite_version", null);
String sqliteVersion = "";
while(cursor.moveToNext()){
sqliteVersion += cursor.getString(0);
}

http://www.sqlite.org/foreignkeys.html "本文档描述了SQLite 3.6.19版本中引入的对SQL外键约束的支持。如果你的版本支持试试:

@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}
于 2013-08-03T22:33:41.680 回答
0

以下将返回 tblReader 中具有相同 bookID 的所有 _id

String query = "SELECT tblReader._id FROM tblReader INNER JOIN tblBook "   
             + "ON tblReader._id = tblBook._id WHERE tblReader.bookID=" + bookId;
return myDataBase.rawQuery(query, null);
于 2013-05-09T04:55:36.500 回答
-1

首先将您的阅读器表修改为

`tblReader: _id 整数主键 AUTOINCREMENT

名称文本

等级整数

bookID 整数 FOREIGN KEY (bookID) 引用 tblBook (_id)`

SQLite 3 默认不支持外键约束,但是我们可以使用 TRIGGERS 强制这样的约束。因此,如果需要,您可以编写触发器。

于 2013-05-09T04:19:38.133 回答