Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite中的外键_Java_Sqlite_Foreign Keys - Fatal编程技术网

Java SQLite中的外键

Java SQLite中的外键,java,sqlite,foreign-keys,Java,Sqlite,Foreign Keys,我正在创建两个表,一个用于书籍,一个用于商店。我希望通过给书店表提供一个商店ID,将书店表中的每本书链接到StoreTable。 该Store_Id将是StoreTable中的主键。外键的语法有问题。我也检查了参考,但没有提供足够的说明。如果有人帮助我,我将不胜感激 public class DatabaseHelper extends SQLiteOpenHelper{ //Name of databases public static final String DATABASE_NAM

我正在创建两个表,一个用于书籍,一个用于商店。我希望通过给书店表提供一个商店ID,将书店表中的每本书链接到StoreTable。 该Store_Id将是StoreTable中的主键。外键的语法有问题。我也检查了参考,但没有提供足够的说明。如果有人帮助我,我将不胜感激

public class DatabaseHelper  extends SQLiteOpenHelper{


//Name of databases
public static final String DATABASE_NAME = "Library.db";
//Version of database
public static final int  DATABASE_VERSION = 1;

//Table of Stores
public static final String STORE_TABLE = "Store_Table";
public static final String STORE_ID = "Store_ID";
public static final String STORE_NAME = "Store_name";
public static final String STORE_Address = "Store_Address";
public static final String STORE_LAT = "lat";
public static final String STORE_LNG = "lng";

//Table of Books
public static final String BOOKS_TABLE = "Books_Table";
public static final String BOOK_ID = "Book_ID";
public static final String BOOK_NAME = "Book_name";
public static final String BOOK_AUTHOR = "Book_Author";
public static final String BOOKStore = "BookStore_ID";

//Creating Stores Table
private static final String SQL_CREATE_TABLE_STORE = "CREATE TABLE " + STORE_TABLE + "("
        + STORE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + STORE_NAME + " TEXT NOT NULL, "
        + STORE_Address + " TEXT NOT NULL, "
        + STORE_LAT + " TEXT NOT NULL, "
        + STORE_LNG + " TEXT NOT NULL"
        +");";
//Creating Books Table
private static final String SQL_CREATE_TABLE_BOOKS = "CREATE TABLE " + BOOKS_TABLE + "("
        + BOOK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + BOOK_NAME + " TEXT NOT NULL, "
        + BOOK_AUTHOR + " TEXT NOT NULL, "
 //How to relate BookStore with Store_ID here?
        +FOREIGN KEY(BOOKStore) REFERENCES STORE_TABLE(STORE_ID));
        +");";



public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    SQLiteDatabase db = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

    sqLiteDatabase.execSQL(SQL_CREATE_TABLE_STORE);
    sqLiteDatabase.execSQL(SQL_CREATE_TABLE_BOOKS);

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    //Clear all data
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + STORE_TABLE);
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + BOOKS_TABLE);

    //RECREAT THE TABLES
    onCreate(sqLiteDatabase);

}
}

我发现Books_表的CREATETABLE语句存在多个问题。首先,如果要将表中的一列指定为外键,则该列必须首先存在。您在定义外键时引用了BookStore_ID列,但实际上从未定义过此列。其次,如果要将列标记为外键,则有一种特定的语法。详情见下文

CREATE TABLE Books_Table (
    Book_ID INTEGER PRIMARY KEY AUTOINCREMENT,
    Book_name TEXT NOT NULL,
    Book_Author TEXT NOT NULL,
    BookStore_ID INTEGER,
    CONSTRAINT fk_bookstore FOREIGN KEY (BookStore_ID)
        REFERENCES Store_Table(Store_ID)
);

这是正确的答案:

private static final String SQL_CREATE_TABLE_BOOKS = "CREATE TABLE " + BOOKS_TABLE + "("
        + BOOK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + BOOK_NAME + " TEXT NOT NULL, "
        + BOOK_AUTHOR + " TEXT NOT NULL, "
 //How to relate BookStore with Store_ID here?
        + " FOREIGN KEY ("+ BOOKStore +") REFERENCES "+STORE_TABLE+"("+STORE_ID+"));";

它说不能解析每个变量和每个关键字上的符号。那么您的Java代码就有问题了。此原始SQL语句应无错误地运行。这未显示任何错误`私有静态最终字符串SQL\u CREATE\u TABLE\u BOOKS=CREATE TABLE+BOOKS\u TABLE+Book\u ID INTEGER主键自动递增,Book\u名称文本,Book\u作者文本,Book\u ID INTEGER,约束fk_bookstore外键bookstore_ID\n+引用存储\u表存储\u ID`