SQlite - Android - 外键语法

时间:2011-03-13 14:06:21

标签: android sqlite foreign-keys

我一直在尝试在我的Android SQLite数据库中使用外键。我尝试了以下语法,但它给了我一个力量关闭:

private static final String TASK_TABLE_CREATE = "create table "
            + TASK_TABLE + " (" + TASK_ID
            + " integer primary key autoincrement, " + TASK_TITLE
            + " text not null, " + TASK_NOTES + " text not null, "
    + TASK_DATE_TIME + " text not null, FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"));";

任何想法我可能做错了什么?如果您需要查看其他表结构,那么我可以,它只是一个非常简单的结构,第二个带有ID和名称。

修改:

这是错误:

  

03-13 13:42:35.389:   ERROR / AndroidRuntime(312):引起:   android.database.sqlite.SQLiteException:   国外未知栏“taskCat”   键定义:创建表提醒   (_id整数主键   自动增量,task_title文本没有   null,注释文本不为null,   reminder_date_time文本不为null,   FOREIGN KEY(taskCat)参考   category(_id));

3 个答案:

答案 0 :(得分:103)

您必须先定义TASK_CAT列,然后在其上设置外键。

private static final String TASK_TABLE_CREATE = "create table "
        + TASK_TABLE + " (" 
        + TASK_ID + " integer primary key autoincrement, " 
        + TASK_TITLE + " text not null, " 
        + TASK_NOTES + " text not null, "
        + TASK_DATE_TIME + " text not null,"
        + TASK_CAT + " integer,"
        + " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+"("+CAT_ID+"));";

您可以在sqlite外键doc上找到更多信息。

答案 1 :(得分:9)

由于我无法发表评论,除了@jethro回答之外还添加了这个注释。

我发现你还需要将FOREIGN KEY行作为创建表语句的最后一部分,否则在安装应用程序时会出现语法错误。我的意思是,你不能做这样的事情:

private static final String TASK_TABLE_CREATE = "create table "
    + TASK_TABLE + " (" + TASK_ID
    + " integer primary key autoincrement, " + TASK_TITLE
    + " text not null, " + TASK_NOTES + " text not null, "
+ TASK_CAT + " integer,"
+ " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"), "
+ TASK_DATE_TIME + " text not null);";

我将TASK_DATE_TIME放在外键行之后。

答案 2 :(得分:2)

正如您在错误描述中看到的那样,您的表包含列(_id,tast_title,notes,reminder_date_time),并且您尝试从“taskCat”列添加外键,但它在您的表中不存在!< / p>