在 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 + ")"
            + ");";

改变这一点,卸载您的应用程序并重新运行它。