【发布时间】:2019-04-04 13:02:29
【问题描述】:
这是上下文。我有一个数据库助手,可以在一个数据库中创建 3 个表。其中两个表有外键。一切正常,一切都很好,但考虑到我想做的事情,我需要使用列表视图而不是文本视图来显示我的数据并能够编辑、删除等。出于某种原因,列表视图在 Android 上与其他编程语言不同。我想出了适配器和所有的废话。我的新问题是我的应用程序不会显示数据,当我检查我的 logcat 时,我收到了这条消息
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist. Available columns: [id, termName, termStart, termEnd]
这是针对一个名为“term_table”的表。所以我将 id 从 'id' 更改为 '_id' 就成功了。
所以一切都很好,对吧?不,因为其他两个表有自己的 ID 和外键。当我对名为“assess_table”的不同表执行相同的查询时,我得到了同样的错误,所以我将“id”更改为“_id”。问题是“courses_table”(第三个表)使用“_id”作为外键来引用名为“term_table”的表。所以我收到一条错误消息,告诉我我正在创建重复的列 - 主键 '_id' 和外键 '_id' 来引用 term_table。
我将“courses_table”的 id 从“_id”重命名为“courses_id”。现在我回到第一方得到同样的错误:
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist. Available columns: [assess_id, assessName, assessDueDate, assessType, courses_id]
所以基本上如果所有三个表都必须命名为 _id 如果外键与引用表的主键具有相同的名称,我应该在创建外键时使用什么语法,所以我总是会得到创建重复列错误。我读到这个 _id 命名方案只是游标适配器的事情。什么语法适合使用?
这是我的数据库助手中的 3 个表
//terms table
public static final String TERM_TABLE_NAME = "term_table";
public static final String COL_TERM1 = "_id";
public static final String COL_TERM2 = "termName";
public static final String COL_TERM3 = "termStart";
public static final String COL_TERM4 = "termEnd";
public static final String TERM_DATABASE_NAME = "term.db";
//courses table
public static final String COURSES_TABLE_NAME = "courses_table";
public static final String COL_COURSE1 = "courses_id";
public static final String COL_COURSE2 = "courseTitle";
public static final String COL_COURSE3 = "courseStartDate";
public static final String COL_COURSE4 = "courseEndDate";
public static final String COL_COURSE5 = "courseStatus";
public static final String COL_COURSE6 = "optionalNote";
public static final String COL_COURSE7 = "mentorName";
public static final String COL_COURSE8 = "mentorPhone";
public static final String COL_COURSE9 = "mentorEmail";
public static final String COL_COURSE_TERMID = "_id";
//assess table
public static final String ASSESS_TABLE_NAME = "assess_table";
public static final String COL_ASSESS1 = "assess_id";
public static final String COL_ASSESS2 = "assessName";
public static final String COL_ASSESS3 = "assessDueDate";
public static final String COL_ASSESS4 = "assessType";
public static final String COL_ASSESS_COURSEID = "courses_id";
这是创建语法
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TERM_TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, termName TEXT, termStart TEXT, termEnd TEXT)");
db.execSQL("CREATE TABLE " + COURSES_TABLE_NAME + " (courses_id INTEGER PRIMARY KEY AUTOINCREMENT, courseTitle TEXT, courseStartDate TEXT, courseEndDate TEXT, courseStatus INTEGER, optionalNote TEXT, mentorName TEXT, mentorPhone TEXT, mentorEmail TEXT, _id INTEGER, FOREIGN KEY (_id) REFERENCES term_table(_id))");
db.execSQL("CREATE TABLE " + ASSESS_TABLE_NAME + " (assess_id INTEGER PRIMARY KEY AUTOINCREMENT, assessName TEXT, assessDueDate TEXT, assessType INTEGER, courses_id INTEGER, FOREIGN KEY (courses_id) REFERENCES courses_table(courses_id))");
}
【问题讨论】:
-
FK 是引用列列表的列列表。第 n 个引用列不必与第 n 个引用列同名。 PS请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码加上所需的输出加上清晰的规范和解释。给出导致原始错误的代码——这就是你给出的代码的作用吗?
标签: java android sqlite foreign-keys