在 SQlite 中创建外键时出错
Error when creating foreign key in SQlite
我正在尝试创建以下表格,但无法弄清楚为什么会出现此错误
04-10 22:30:15.373 32592-32592/com.bluetask E/SQLiteLog: (1) unknown column "rem_id" in foreign key definition
从代码中可以看出,我以正确的顺序创建了表。
我在添加外键约束之前创建列。
如果您有任何提示,我将不胜感激。
public static final String DATABASE_NAME = "bluetask.db";
private static final int DATABASE_VERSION = 2;
public static final String TABLE_REMINDERS = "reminders";
public static final String TABLE_REMINDERPOSITIONS = "rem_pos";
public static final String TABLE_POSITIONS = "positions";
public static final String REMINDERS_COLUMN_REM_ID = "rem_id";
public static final String REMINDERS_COLUMN_DATE = "date";
public static final String REMINDERS_COLUMN_NAME = "name";
public static final String REMINDERS_COLUMN_DESCR = "description";
public static final String REMINDERS_COLUMN_DONE = "done";
public static final String REMINDERPOSITIONS_COLUMN_REM_ID = "rem_id";
public static final String REMINDERPOSITIONS_COLUMN_POS_ID = "pos_id";
public static final String POSITIONS_COLUMN_POS_ID = "pos_id";
public static final String POSITIONS_COLUMN_POS_TITLE = "pos_title";
public static final String POSITIONS_COLUMN_STREET = "street";
public static final String POSITIONS_COLUMN_STR_NUM = "str_num";
public static final String POSITIONS_COLUMN_ZIP = "zip";
public static final String POSITIONS_COLUMN_CITY = "city";
public static final String POSITIONS_COLUMN_GEO_DATA = "geo_data";
private static final String CREATE_TABLE_REMINDERS =
"CREATE TABLE " + TABLE_REMINDERS + "("
+ REMINDERS_COLUMN_REM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ REMINDERS_COLUMN_NAME + " TEXT NOT NULL, "
+ REMINDERS_COLUMN_DESCR + " TEXT NOT NULL, "
+ REMINDERS_COLUMN_DATE + " INTEGER NOT NULL, "
+ REMINDERS_COLUMN_DONE + " INTEGER NOT NULL"
+ ");";
private static final String CREATE_TABLE_POSITIONS =
"CREATE TABLE " + TABLE_POSITIONS + "("
+ POSITIONS_COLUMN_POS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ POSITIONS_COLUMN_POS_TITLE + " TEXT NOT NULL, "
+ POSITIONS_COLUMN_CITY + " TEXT, "
+ POSITIONS_COLUMN_ZIP + "INTEGER, "
+ POSITIONS_COLUMN_STREET + " TEXT, "
+ POSITIONS_COLUMN_STR_NUM + " TEXT, "
+ POSITIONS_COLUMN_GEO_DATA + " TEXT NOT NULL"
+ ");";
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + "INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + "INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
public BlueTaskSQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database){
database.execSQL(CREATE_TABLE_REMINDERS);
database.execSQL(CREATE_TABLE_POSITIONS);
database.execSQL(CREATE_TABLE_REMINDERPOSITIONS);
}
这是 logcat 输出:
04-10 22:30:15.373 32592-32592/com.bluetask E/SQLiteLog: (1) unknown column "rem_id" in foreign key definition
04-10 22:30:15.392 32592-32592/com.bluetask D/AndroidRuntime: Shutting down VM
04-10 22:30:15.393 32592-32592/com.bluetask E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bluetask, PID: 32592
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bluetask/com.bluetask.AddReminderActivity}: android.database.sqlite.SQLiteException: unknown column "rem_id" in foreign key definition (code 1): , while compiling: CREATE TABLE rem_pos(rem_idINTEGER, pos_idINTEGER, FOREIGN KEY (rem_id) REFERENCES reminders(rem_id), FOREIGN KEY (pos_id) REFERENCES positions(pos_id), PRIMARY KEY (rem_id, pos_id));
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.database.sqlite.SQLiteException: unknown column "rem_id" in foreign key definition (code 1): , while compiling: CREATE TABLE rem_pos(rem_idINTEGER, pos_idINTEGER, FOREIGN KEY (rem_id) REFERENCES reminders(rem_id), FOREIGN KEY (pos_id) REFERENCES positions(pos_id), PRIMARY KEY (rem_id, pos_id));
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
at com.bluetask.database.BlueTaskSQLiteOpenHelper.onCreate(BlueTaskSQLiteOpenHelper.java:70)
at com.bluetask.database.BlueTaskSQLiteOpenHelper.onUpgrade(BlueTaskSQLiteOpenHelper.java:79)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.bluetask.database.BlueTaskDataSource.open(BlueTaskDataSource.java:28)
at com.bluetask.AddReminderActivity.onCreate(AddReminderActivity.java:34)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
您的表中有几列的列名后缺少空格。您可以在异常 rem_idINTEGER, pos_idINTEGER
.
中查看 CREATE TABLE
命令时判断
在TABLE_POSITIONS
+ POSITIONS_COLUMN_ZIP + " INTEGER, "
并且在TABLE_REMINDERPOSITIONS
+ REMINDERPOSITIONS_COLUMN_REM_ID + " INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + " INTEGER, "
此 table 未正确创建,因为您在列名及其数据类型之间缺少一些空格:
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + "INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + "INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
应该是:
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + " INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + " INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
改变这一点,卸载您的应用程序并重新运行它。
我正在尝试创建以下表格,但无法弄清楚为什么会出现此错误
04-10 22:30:15.373 32592-32592/com.bluetask E/SQLiteLog: (1) unknown column "rem_id" in foreign key definition
从代码中可以看出,我以正确的顺序创建了表。
我在添加外键约束之前创建列。
如果您有任何提示,我将不胜感激。
public static final String DATABASE_NAME = "bluetask.db";
private static final int DATABASE_VERSION = 2;
public static final String TABLE_REMINDERS = "reminders";
public static final String TABLE_REMINDERPOSITIONS = "rem_pos";
public static final String TABLE_POSITIONS = "positions";
public static final String REMINDERS_COLUMN_REM_ID = "rem_id";
public static final String REMINDERS_COLUMN_DATE = "date";
public static final String REMINDERS_COLUMN_NAME = "name";
public static final String REMINDERS_COLUMN_DESCR = "description";
public static final String REMINDERS_COLUMN_DONE = "done";
public static final String REMINDERPOSITIONS_COLUMN_REM_ID = "rem_id";
public static final String REMINDERPOSITIONS_COLUMN_POS_ID = "pos_id";
public static final String POSITIONS_COLUMN_POS_ID = "pos_id";
public static final String POSITIONS_COLUMN_POS_TITLE = "pos_title";
public static final String POSITIONS_COLUMN_STREET = "street";
public static final String POSITIONS_COLUMN_STR_NUM = "str_num";
public static final String POSITIONS_COLUMN_ZIP = "zip";
public static final String POSITIONS_COLUMN_CITY = "city";
public static final String POSITIONS_COLUMN_GEO_DATA = "geo_data";
private static final String CREATE_TABLE_REMINDERS =
"CREATE TABLE " + TABLE_REMINDERS + "("
+ REMINDERS_COLUMN_REM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ REMINDERS_COLUMN_NAME + " TEXT NOT NULL, "
+ REMINDERS_COLUMN_DESCR + " TEXT NOT NULL, "
+ REMINDERS_COLUMN_DATE + " INTEGER NOT NULL, "
+ REMINDERS_COLUMN_DONE + " INTEGER NOT NULL"
+ ");";
private static final String CREATE_TABLE_POSITIONS =
"CREATE TABLE " + TABLE_POSITIONS + "("
+ POSITIONS_COLUMN_POS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ POSITIONS_COLUMN_POS_TITLE + " TEXT NOT NULL, "
+ POSITIONS_COLUMN_CITY + " TEXT, "
+ POSITIONS_COLUMN_ZIP + "INTEGER, "
+ POSITIONS_COLUMN_STREET + " TEXT, "
+ POSITIONS_COLUMN_STR_NUM + " TEXT, "
+ POSITIONS_COLUMN_GEO_DATA + " TEXT NOT NULL"
+ ");";
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + "INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + "INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
public BlueTaskSQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database){
database.execSQL(CREATE_TABLE_REMINDERS);
database.execSQL(CREATE_TABLE_POSITIONS);
database.execSQL(CREATE_TABLE_REMINDERPOSITIONS);
}
这是 logcat 输出:
04-10 22:30:15.373 32592-32592/com.bluetask E/SQLiteLog: (1) unknown column "rem_id" in foreign key definition
04-10 22:30:15.392 32592-32592/com.bluetask D/AndroidRuntime: Shutting down VM
04-10 22:30:15.393 32592-32592/com.bluetask E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bluetask, PID: 32592
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bluetask/com.bluetask.AddReminderActivity}: android.database.sqlite.SQLiteException: unknown column "rem_id" in foreign key definition (code 1): , while compiling: CREATE TABLE rem_pos(rem_idINTEGER, pos_idINTEGER, FOREIGN KEY (rem_id) REFERENCES reminders(rem_id), FOREIGN KEY (pos_id) REFERENCES positions(pos_id), PRIMARY KEY (rem_id, pos_id));
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.database.sqlite.SQLiteException: unknown column "rem_id" in foreign key definition (code 1): , while compiling: CREATE TABLE rem_pos(rem_idINTEGER, pos_idINTEGER, FOREIGN KEY (rem_id) REFERENCES reminders(rem_id), FOREIGN KEY (pos_id) REFERENCES positions(pos_id), PRIMARY KEY (rem_id, pos_id));
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
at com.bluetask.database.BlueTaskSQLiteOpenHelper.onCreate(BlueTaskSQLiteOpenHelper.java:70)
at com.bluetask.database.BlueTaskSQLiteOpenHelper.onUpgrade(BlueTaskSQLiteOpenHelper.java:79)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.bluetask.database.BlueTaskDataSource.open(BlueTaskDataSource.java:28)
at com.bluetask.AddReminderActivity.onCreate(AddReminderActivity.java:34)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
您的表中有几列的列名后缺少空格。您可以在异常 rem_idINTEGER, pos_idINTEGER
.
CREATE TABLE
命令时判断
在TABLE_POSITIONS
+ POSITIONS_COLUMN_ZIP + " INTEGER, "
并且在TABLE_REMINDERPOSITIONS
+ REMINDERPOSITIONS_COLUMN_REM_ID + " INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + " INTEGER, "
此 table 未正确创建,因为您在列名及其数据类型之间缺少一些空格:
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + "INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + "INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
应该是:
private static final String CREATE_TABLE_REMINDERPOSITIONS =
"CREATE TABLE " + TABLE_REMINDERPOSITIONS + "("
+ REMINDERPOSITIONS_COLUMN_REM_ID + " INTEGER, "
+ REMINDERPOSITIONS_COLUMN_POS_ID + " INTEGER, "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ") REFERENCES " + TABLE_REMINDERS + "(" + REMINDERS_COLUMN_REM_ID + "), "
+ "FOREIGN KEY (" + REMINDERPOSITIONS_COLUMN_POS_ID + ") REFERENCES " + TABLE_POSITIONS + "(" + POSITIONS_COLUMN_POS_ID + "), "
+ "PRIMARY KEY (" + REMINDERPOSITIONS_COLUMN_REM_ID + ", " + REMINDERPOSITIONS_COLUMN_POS_ID + ")"
+ ");";
改变这一点,卸载您的应用程序并重新运行它。