Archived
Added Timetable.kt which was a PAIN because SQLite does not support ADD FOREIGN KEY on ALTER TABLE, and as such, the required workaround is to create a temporary table with the new constraint added, insert the values from the old table into the new table, drop the old table, and finally rename the new table to the name of the old table so that the app thinks that nothing ever happened... UGH
This commit is contained in:
@@ -37,6 +37,12 @@ class MainActivity : FragmentActivity() {
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
// if (viewModel.getTimetableCount() == 0) {
|
||||
// viewModel.insertTimetable(
|
||||
// Timetable(0, "default")
|
||||
// )
|
||||
// }
|
||||
|
||||
/*
|
||||
* Check whether the user is launching the app for the first time in order to show a
|
||||
* tutorial. This value will be changed to 'false' upon completing the tutorial, thus not
|
||||
|
||||
@@ -73,6 +73,11 @@ interface AppDAO {
|
||||
@Query("DELETE FROM studip_events")
|
||||
fun nukeEvents()
|
||||
|
||||
/* --- timetables --- */
|
||||
|
||||
@Insert
|
||||
fun insertTimetable(timetable: Timetable)
|
||||
|
||||
/* --- event tasks --- */
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.denizk0461.weserplaner.model.*
|
||||
*/
|
||||
@Database(
|
||||
entities = [
|
||||
Timetable::class,
|
||||
StudIPEvent::class,
|
||||
OfferDate::class,
|
||||
OfferCanteen::class,
|
||||
@@ -21,10 +22,11 @@ import com.denizk0461.weserplaner.model.*
|
||||
OfferItem::class,
|
||||
EventTask::class,
|
||||
],
|
||||
version = 21,
|
||||
version = 22,
|
||||
exportSchema = true,
|
||||
autoMigrations = [
|
||||
AutoMigration(from = 20, to = 21),
|
||||
// AutoMigration(from = 21, to = 22),
|
||||
],
|
||||
)
|
||||
abstract class AppDatabase : RoomDatabase() {
|
||||
@@ -58,6 +60,7 @@ abstract class AppDatabase : RoomDatabase() {
|
||||
"event_db",
|
||||
).addMigrations(
|
||||
migrationAddNewsToOfferCanteen_19_20,
|
||||
migration_21_22,
|
||||
// migrationAddTimetableId_20_21,
|
||||
// migrationAddEventTask_20_21,
|
||||
)
|
||||
@@ -79,5 +82,48 @@ abstract class AppDatabase : RoomDatabase() {
|
||||
database.execSQL("ALTER TABLE offer_canteen ADD COLUMN news TEXT NOT NULL DEFAULT ''")
|
||||
}
|
||||
}
|
||||
|
||||
private val migration_21_22 = object : Migration(21, 22) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
// Add 'timetables' table
|
||||
database.execSQL("CREATE TABLE 'timetables' ('id' INTEGER NOT NULL UNIQUE, 'name' TEXT NOT NULL, PRIMARY KEY('id' AUTOINCREMENT));")
|
||||
|
||||
// Insert a timetable
|
||||
database.execSQL("INSERT INTO timetables VALUES (0, 'default')")
|
||||
|
||||
/*
|
||||
* Create temporary Stud.IP event table. This is necessary because SQLite doesn't
|
||||
* implement ADD FOREIGN KEY on ALTER TABLE >:(
|
||||
*/
|
||||
database.execSQL("""
|
||||
CREATE TABLE IF NOT EXISTS studip_events_temp (
|
||||
'eventId' INTEGER NOT NULL UNIQUE,
|
||||
'timetableId' INTEGER NOT NULL,
|
||||
'title' TEXT NOT NULL,
|
||||
'lecturer' TEXT NOT NULL,
|
||||
'room' TEXT NOT NULL,
|
||||
'day' INTEGER NOT NULL,
|
||||
'timeslotStart' TEXT NOT NULL,
|
||||
'timeslotEnd' TEXT NOT NULL,
|
||||
'timeslotId' INTEGER NOT NULL,
|
||||
'colour' INTEGER NOT NULL DEFAULT 0,
|
||||
FOREIGN KEY('timetableId') REFERENCES 'timetables'('id') ON DELETE CASCADE,
|
||||
PRIMARY KEY('eventId' AUTOINCREMENT)
|
||||
);
|
||||
""".trimIndent())
|
||||
|
||||
// Copy data from old table to new table
|
||||
database.execSQL("""
|
||||
INSERT INTO studip_events_temp (eventId, timetableId, title, lecturer, room, day, timeslotStart, timeslotEnd, timeslotId, colour)
|
||||
SELECT eventId, timetableId, title, lecturer, room, day, timeslotStart, timeslotEnd, timeslotId, colour FROM studip_events
|
||||
""".trimIndent())
|
||||
|
||||
// Delete old table
|
||||
database.execSQL("DROP TABLE studip_events")
|
||||
|
||||
// Rename new table to the old table's name
|
||||
database.execSQL("ALTER TABLE studip_events_temp RENAME TO studip_events")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -159,6 +159,10 @@ class AppRepository(app: Application) {
|
||||
dao.delete(event)
|
||||
}
|
||||
|
||||
fun insertTimetable(timetable: Timetable) {
|
||||
dao.insertTimetable(timetable)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all canteen offer date objects.
|
||||
*
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
import androidx.room.ColumnInfo
|
||||
import androidx.room.Entity
|
||||
import androidx.room.ForeignKey
|
||||
import androidx.room.PrimaryKey
|
||||
|
||||
/**
|
||||
@@ -20,10 +21,20 @@ import androidx.room.PrimaryKey
|
||||
* @param timeslotId minute the event starts at - used for ordering
|
||||
* @param colour user-defined colour the event will be shown in - UNIMPLEMENTED
|
||||
*/
|
||||
@Entity(tableName = "studip_events")
|
||||
@Entity(
|
||||
tableName = "studip_events",
|
||||
foreignKeys = [
|
||||
ForeignKey(
|
||||
Timetable::class,
|
||||
["id"],
|
||||
["timetableId"],
|
||||
ForeignKey.CASCADE,
|
||||
),
|
||||
],
|
||||
)
|
||||
data class StudIPEvent(
|
||||
@PrimaryKey(autoGenerate = true) val eventId: Int = 0,
|
||||
@ColumnInfo(defaultValue = "0") val timetableId: Int,
|
||||
val timetableId: Int,
|
||||
val title: String,
|
||||
val lecturer: String,
|
||||
val room: String,
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.denizk0461.weserplaner.model
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
|
||||
/**
|
||||
* Timetable parent object that [StudIPEvent]s are assigned to. These can be named to denote
|
||||
* different semesters.
|
||||
*
|
||||
* @param id unique primary key value
|
||||
* @param name title of the timetable
|
||||
*/
|
||||
@Entity(tableName = "timetables")
|
||||
data class Timetable(
|
||||
@PrimaryKey(autoGenerate = true) val id: Int,
|
||||
val name: String,
|
||||
)
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.denizk0461.weserplaner.viewmodel
|
||||
|
||||
import android.app.Application
|
||||
import com.denizk0461.weserplaner.model.Timetable
|
||||
import com.denizk0461.weserplaner.values.AppLayout
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<resources>
|
||||
<style name="Theme.StudIPTimetable" parent="Base.Theme.StudIPTimetable">
|
||||
<!-- Transparent system bars for edge-to-edge. -->
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:windowLightStatusBar">?attr/isLightTheme</item>
|
||||
</style>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user