Estou tentando criar as tabelas a seguir e não consigo descobrir por que recebo esse erro
04-10 22:30:15.373 32592-32592/com.bluetask E/SQLiteLog: (1) unknown column "rem_id" in foreign key definition
Como pode ser visto no código, crio as tabelas na ordem correta.
Eu crio as colunas antes de adicionar a restrição de chave estrangeira.
Eu apreciaria qualquer dica que você possa ter.
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);
}
E este é o logcat out:
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)
Esta tabela não foi criada corretamente, pois faltam alguns espaços entre os nomes das colunas e seus tipos de dados:
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 + ")"
+ ");";
Deveria estar:
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 + ")"
+ ");";
Mude isso, desinstale seu aplicativo e execute-o novamente.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras