设置外键时游标找不到列
Cursor cannot find a column when foreign key is setup
我已经尝试了很长时间了。我正在尝试根据 ID 从数据库中检索内容。在我将 INNER JOIN 和 WHERE 子句引入我的语句之前,一切都很好。我收到这个错误
错误
android.database.sqlite.SQLiteException: no such column: classes_sections.classes_sections_ids (code 1): , while compiling: SELECT * FROM classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =2
我认为问题出在我的外键引用和我的查询上。我真的需要你的帮助 here.I 我被困在这一点上了。谢谢。
这是我声明我在数据库中使用的常量的地方(FK 表示外键和 PK 主键)
//Classes Table Columns names
private static final String COLUMN_CLASSES_ID = "classes_id";
private static final String COLUMN_CLASS_ITEM_INDEX ="class_item_index";
private static final String COLUMN_CLASSES_NAME = "classes_name";
private static final String COLUMN_CLASSES_CODENAME = "classes_codename";
private static final String COLUMN_CLASSES_SECTIONS = "classes_sections_id";//FK
private static final String COLUMN_CLASSES_TEACHERS = "classes_teachers";//FK
private static final String COLUMN_CLASSES_STUDENTS = "classes_students";//FK
//Classes Sections Table Column names
private static final String COLUMN_CLASSES_SECTIONS_ID = "classes_sections_ids";//PK
private static final String COLUMN_CLASSES_SECTIONS_NAME = "classes_sections_name";
private static final String COLUMN_CLASSES_SECTIONS_DESCRIPTION = "classes_sections_description";
这是我的表格的代码
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + " INTEGER) REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
//create sections sql query
private String CREATE_CLASSES_SECTIONS_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES_SECTIONS + "("
+ COLUMN_CLASSES_SECTIONS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASSES_SECTIONS_NAME + " VARCHAR,"
+ COLUMN_CLASSES_SECTIONS_DESCRIPTION + " VARCHAR" + ")";
此方法通过 ID 从数据库中检索数据
public ArrayList<SectionsBean> getAllSectionsByClassesID(long id){
String selectQuery = "SELECT * FROM "
+ "classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =" + id;
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<SectionsBean> sectionsBeanList = new ArrayList<SectionsBean>();
Cursor cursor = db.rawQuery(selectQuery,null);
Log.i("Query details", String.valueOf(cursor));
Log.d("DataDetails", DatabaseUtils.dumpCursorToString(cursor));
while (cursor.moveToNext()) {
ClassesBean classesBean = new ClassesBean();
classesBean.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_CLASSES_ID)));
classesBean.setClasses_name(cursor.getString(cursor.getColumnIndex(COLUMN_CLASSES_NAME)));
SectionsBean sectionsBean = new SectionsBean();
sectionsBean.setSectionsID(cursor.getLong(cursor.getColumnIndex(COLUMN_CLASSES_SECTIONS_ID)));
sectionsBean.setSections_name(cursor.getString(cursor.getColumnIndex(COLUMN_CLASSES_SECTIONS_NAME)));
sectionsBean.setClassesBean(classesBean);
sectionsBeanList.add(sectionsBean);
}
return sectionsBeanList;
}
您的问题可能是由于输入错误造成的,也许 classes_sections
不等同于 TABLE_CLASSES_SECTIONS
解决的问题。
我建议您始终只对所有数据库组件(数据库 tables 列)使用单一来源。
因此代替:-
String selectQuery = "SELECT * FROM "
+ "classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =" + id;
您应该按照以下行构建查询:-
String selectQuery = "SELECT * FROM " +
TABLE_CLASSES +
" INNER JOIN " + TABLE_CLASSES_SECTIONS +
" ON " +
TABLE_CLASSES_SECTIONS + "." + COLUMN_CLASSES_SECTIONS_ID +
" = " + TABLE_CLASSES + "." + COLUMN_CLASSES_SECTIONS +
" WHERE " +
TABLE_CLASSES + "." + COLUMN_CLASSES_SECTIONS +
" = " + String.valueOf(id);
备注
- 这是 in-principle 代码,尚未经过测试,因此可能包含打字错误。
编辑
仔细检查后,类 table 的定义也存在问题,因为您已经有效地编码了 :-
CREATE TABLE IF NOT EXISTS classes (
classes_id INTEGER PRIMARY KEY AUTOINCREMENT,"
class_item_index NUMBER,
classes_name" VARCHAR,
classes_codename VARCHAR,
classes_sections_id INTEGER,
classes_teachers VARCHAR,
classes_students VARCHAR,
FOREIGN KEY(classes_sections_id INTEGER) REFERENCES classes_sections (classes_sections_ids) ON DELETE CASCADE);
table 约束定义在语法上不正确,因为 column_name 参数接受 1 个或多个逗号分隔的列名称的列表。 INTEGER 根据 :-
不是有效关键字
因此你应该改变 :-
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + " INTEGER) REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
到(*即从 column_names 参数中删除 INTEGER**):-
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + ") REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
备注
- 此更改需要删除并重新创建 类 table。
- 最简单的方法是删除数据库,在这种情况下
onCreate
方法(假设您使用的是 SQLiteOpenHelper 的子类又名 DatabaseHelper) 将被调用。
- 您可以clear/delete应用程序的数据或卸载应用程序,这将有效删除数据库。
额外
使用从上述作品(语法上)派生的以下 SQL :-
DROP TABLE IF EXISTS classes;
CREATE TABLE IF NOT EXISTS classes (
classes_id INTEGER PRIMARY KEY AUTOINCREMENT,
class_item_index NUMBER,
classes_name VARCHAR,
classes_codename VARCHAR,
classes_sections_id INTEGER,
classes_teachers VARCHAR,
classes_students VARCHAR,
FOREIGN KEY(classes_sections_id) REFERENCES classes_sections (classes_sections_ids) ON DELETE CASCADE);
DROP TABLE IF EXISTS classes_sections;
CREATE TABLE IF NOT EXISTS classes_sections (
classes_sections_ids INTEGER PRIMARY KEY AUTOINCREMENT,
classes_sections_name VARCHAR,
classes_sections_description VARCHAR);
SELECT * FROM classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =2
即:-
我已经尝试了很长时间了。我正在尝试根据 ID 从数据库中检索内容。在我将 INNER JOIN 和 WHERE 子句引入我的语句之前,一切都很好。我收到这个错误
错误
android.database.sqlite.SQLiteException: no such column: classes_sections.classes_sections_ids (code 1): , while compiling: SELECT * FROM classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =2
我认为问题出在我的外键引用和我的查询上。我真的需要你的帮助 here.I 我被困在这一点上了。谢谢。
这是我声明我在数据库中使用的常量的地方(FK 表示外键和 PK 主键)
//Classes Table Columns names
private static final String COLUMN_CLASSES_ID = "classes_id";
private static final String COLUMN_CLASS_ITEM_INDEX ="class_item_index";
private static final String COLUMN_CLASSES_NAME = "classes_name";
private static final String COLUMN_CLASSES_CODENAME = "classes_codename";
private static final String COLUMN_CLASSES_SECTIONS = "classes_sections_id";//FK
private static final String COLUMN_CLASSES_TEACHERS = "classes_teachers";//FK
private static final String COLUMN_CLASSES_STUDENTS = "classes_students";//FK
//Classes Sections Table Column names
private static final String COLUMN_CLASSES_SECTIONS_ID = "classes_sections_ids";//PK
private static final String COLUMN_CLASSES_SECTIONS_NAME = "classes_sections_name";
private static final String COLUMN_CLASSES_SECTIONS_DESCRIPTION = "classes_sections_description";
这是我的表格的代码
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + " INTEGER) REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
//create sections sql query
private String CREATE_CLASSES_SECTIONS_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES_SECTIONS + "("
+ COLUMN_CLASSES_SECTIONS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASSES_SECTIONS_NAME + " VARCHAR,"
+ COLUMN_CLASSES_SECTIONS_DESCRIPTION + " VARCHAR" + ")";
此方法通过 ID 从数据库中检索数据
public ArrayList<SectionsBean> getAllSectionsByClassesID(long id){
String selectQuery = "SELECT * FROM "
+ "classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =" + id;
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<SectionsBean> sectionsBeanList = new ArrayList<SectionsBean>();
Cursor cursor = db.rawQuery(selectQuery,null);
Log.i("Query details", String.valueOf(cursor));
Log.d("DataDetails", DatabaseUtils.dumpCursorToString(cursor));
while (cursor.moveToNext()) {
ClassesBean classesBean = new ClassesBean();
classesBean.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_CLASSES_ID)));
classesBean.setClasses_name(cursor.getString(cursor.getColumnIndex(COLUMN_CLASSES_NAME)));
SectionsBean sectionsBean = new SectionsBean();
sectionsBean.setSectionsID(cursor.getLong(cursor.getColumnIndex(COLUMN_CLASSES_SECTIONS_ID)));
sectionsBean.setSections_name(cursor.getString(cursor.getColumnIndex(COLUMN_CLASSES_SECTIONS_NAME)));
sectionsBean.setClassesBean(classesBean);
sectionsBeanList.add(sectionsBean);
}
return sectionsBeanList;
}
您的问题可能是由于输入错误造成的,也许 classes_sections
不等同于 TABLE_CLASSES_SECTIONS
解决的问题。
我建议您始终只对所有数据库组件(数据库 tables 列)使用单一来源。
因此代替:-
String selectQuery = "SELECT * FROM "
+ "classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =" + id;
您应该按照以下行构建查询:-
String selectQuery = "SELECT * FROM " +
TABLE_CLASSES +
" INNER JOIN " + TABLE_CLASSES_SECTIONS +
" ON " +
TABLE_CLASSES_SECTIONS + "." + COLUMN_CLASSES_SECTIONS_ID +
" = " + TABLE_CLASSES + "." + COLUMN_CLASSES_SECTIONS +
" WHERE " +
TABLE_CLASSES + "." + COLUMN_CLASSES_SECTIONS +
" = " + String.valueOf(id);
备注
- 这是 in-principle 代码,尚未经过测试,因此可能包含打字错误。
编辑
仔细检查后,类 table 的定义也存在问题,因为您已经有效地编码了 :-
CREATE TABLE IF NOT EXISTS classes (
classes_id INTEGER PRIMARY KEY AUTOINCREMENT,"
class_item_index NUMBER,
classes_name" VARCHAR,
classes_codename VARCHAR,
classes_sections_id INTEGER,
classes_teachers VARCHAR,
classes_students VARCHAR,
FOREIGN KEY(classes_sections_id INTEGER) REFERENCES classes_sections (classes_sections_ids) ON DELETE CASCADE);
table 约束定义在语法上不正确,因为 column_name 参数接受 1 个或多个逗号分隔的列名称的列表。 INTEGER 根据 :-
不是有效关键字因此你应该改变 :-
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + " INTEGER) REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
到(*即从 column_names 参数中删除 INTEGER**):-
// create classes_table sql query
private String CREATE_CLASSES_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_CLASSES + "("
+ COLUMN_CLASSES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_CLASS_ITEM_INDEX + " NUMBER,"
+ COLUMN_CLASSES_NAME + " VARCHAR," + COLUMN_CLASSES_CODENAME + " VARCHAR, " + COLUMN_CLASSES_SECTIONS + " INTEGER," + COLUMN_CLASSES_TEACHERS
+ " VARCHAR," + COLUMN_CLASSES_STUDENTS + " VARCHAR,"
+ "FOREIGN KEY(" + COLUMN_CLASSES_SECTIONS + ") REFERENCES " + TABLE_CLASSES_SECTIONS + "(" + COLUMN_CLASSES_SECTIONS_ID + ") ON DELETE CASCADE " + ");";
备注
- 此更改需要删除并重新创建 类 table。
- 最简单的方法是删除数据库,在这种情况下
onCreate
方法(假设您使用的是 SQLiteOpenHelper 的子类又名 DatabaseHelper) 将被调用。 - 您可以clear/delete应用程序的数据或卸载应用程序,这将有效删除数据库。
- 最简单的方法是删除数据库,在这种情况下
额外
使用从上述作品(语法上)派生的以下 SQL :-
DROP TABLE IF EXISTS classes;
CREATE TABLE IF NOT EXISTS classes (
classes_id INTEGER PRIMARY KEY AUTOINCREMENT,
class_item_index NUMBER,
classes_name VARCHAR,
classes_codename VARCHAR,
classes_sections_id INTEGER,
classes_teachers VARCHAR,
classes_students VARCHAR,
FOREIGN KEY(classes_sections_id) REFERENCES classes_sections (classes_sections_ids) ON DELETE CASCADE);
DROP TABLE IF EXISTS classes_sections;
CREATE TABLE IF NOT EXISTS classes_sections (
classes_sections_ids INTEGER PRIMARY KEY AUTOINCREMENT,
classes_sections_name VARCHAR,
classes_sections_description VARCHAR);
SELECT * FROM classes INNER JOIN classes_sections ON classes_sections.classes_sections_ids = classes.classes_sections_id WHERE classes.classes_id =2
即:-