SQL injection for raw query in Room migration class - android

OWASP tool gives warning of sql injection while writing raw sql query in Room migration. Is there any solution to overcome for this problem. Below is my code:
class Migration1to2 : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE Book ADD COLUMN pub_year INTEGER")
}
}

Related

Android Room DB Migration

Problem - Room DB getting wiped/cleared when doing force update play store update. I am working on a chat messenger application which uses Room DB as local database. Whenever I do a store update with increasing DB version, the local DB gets cleared and messages history are lost.
I'm Using Room DB. My Application is in the Play Store with the use of Room DB and the version is 4.
My Question is I'm changing the 9 tables schema, and now that I update the DB version, each table schema changes. Should I increase the DB version here? How can I accomplish this without losing the user data using Room DB for force update in Play Store? Ex. DB version is 4, I change the two tables’ elements like in the below query.
Do I need to increase DB version twice as two tables are changed or change to one number incremental will be fine? Example: Do I need DB to increase version to 6 OR keeping it 5 is enough?
private val mMigrationMessageStatus: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE message_status RENAME TO MessageStatus")
database.execSQL("ALTER TABLE MessageStatus ADD COLUMN userId TEXT NOT NULL default ''")
}
}
private val mMigrationGroupMember: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE group_member RENAME TO GroupMember")
database.execSQL("ALTER TABLE GroupMember ADD COLUMN userId TEXT NOT NULL default ''")
}
}
return Room.databaseBuilder(context, AppDatabase::class.java, dbName)
.allowMainThreadQueries()
.addMigrations(mMigrationMessageStatus,mMigrationGroupMember)
.build()
From room version 2.4.0, you can easily update using autoMigrations.
DATABASE CLASS
#Database(
version = 3,
autoMigrations = [
AutoMigration(from = 1, to = 2),
AutoMigration(from = 2, to = 3)
],
.....
)
DATA CLASS
#Entity(tableName = "user")
data class DataUser(
....
// I added this column, like this
#ColumnInfo(defaultValue = "")var test: String = ""
)
see reference below
android developer: room version2.4.0
android developer: autoMigration

Move tables to a new database migration Room Android

I'm using Room in Android for my databases. Recently I had to create an alternate for my main database so now I have 2 databases.
abstract class FirstDatabase : RoomDatabase()
abstract class ScondDatabase : RoomDatabase()
I have a table in the FirstDataBase that I want to copy to the SecondDataBase. I know I should write migration but I don't know how I should do that.
This is my current migration with dagger for room:
fun provideDatabaseMigration56(): Migration {
return object : Migration(DATABASE_VERSION_5, DATABASE_VERSION_6) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("DROP TABLE IF EXISTS `pins`")
}
}
}
fun provideDatabaseMigration45(): Migration {
return object : Migration(DATABASE_VERSION_4, DATABASE_VERSION_5) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `pins` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `slug` TEXT NOT NULL)")
}
}
}
What you're looking for is the SQLite ATTACH DATABASE statement. This allows you to attach an additional database to the current connection and then run queries referencing tables within both. There is some detailed documentation here which shows the syntax:
ATTACH DATABASE file_name AS database_name;
You can then run queries referencing tables from both databases, but make sure that when referencing a table from the attached database that you refer to it as
database_name.table_name
as opposed to just table_name.

How to Migrate Not Null table column into Null in Android Room database

I'm new to android room library. I need to migrate a Not Null column to Null,
But room migration only allow ADD or RENAME in ALTER table query. How do execute a column migration query?
#Entity(tableName = "vehicle_detail")
data class VehicleDetailsEntity(
#PrimaryKey(autoGenerate = true)
val vehicleClientId: Long = 0,
val vehicleId: String,
val updatedOn: Date,
val updatedBy: String
)
I need to change table structure into
#Entity(tableName = "vehicle_detail")
data class VehicleDetailsEntity(
#PrimaryKey(autoGenerate = true)
val vehicleClientId: Long = 0,
val vehicleId: String,
val updatedOn: Date?,
val updatedBy: String?
)
java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
You need to run a migration since SQLite doesn't allow column constraint modification.
For that migration you need to create a new temp table and copy all your previous data to it, then delete the old table and rename the temp one to the needed table name.
If you have a scheme directory, you can find your exact creation SQL query which you should copy on your migration (I just figured it out from a scheme of mine and could not be 100% correct):
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// Create the new table
database.execSQL(
"CREATE TABLE IF NOT EXISTS VehicleDetailsEntityTmp (vehicleId TEXT NOT NULL, updatedOn TEXT, updatedBy TEXT,vehicleClientId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL )"
)
// Copy the data
database.execSQL(
"INSERT INTO VehicleDetailsEntityTmp (vehicleId, updatedOn, updatedBy ,vehicleClientId) SELECT vehicleId, updatedOn, updatedBy ,vehicleClientId FROM VehicleDetailsEntity ")
// Remove the old table
database.execSQL("DROP TABLE VehicleDetailsEntity")
// Change the table name to the correct one
database.execSQL("ALTER TABLE VehicleDetailsEntityTmp RENAME TO VehicleDetailsEntity")
}
}

Android room migration add a list of enums

I'm saving
data class Settings(
val foo: Int
)
into my room database version 1.
Now I need to extend Settings to
data class Settings(
val foo: Int,
val bar: ArrayList<Baz>
)
where
enum class Baz {
A, B, C
}
so I need to do a migration to version 2.
I have type converters for bar. I'm currently trying something like
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE settings ADD COLUMN bar TEXT")
}
}
but this gives me an IllegalStateException: Migration didn't properly handle Settings... error.
And I'm stuck. So please help! How do I get that migration working??
Turns out it was my lack of SQLite skills that was in the way.
First of all, I needed to set a default value since my barwasn't allowed to be null. Second, ALTER TABLE is crazy limited and didn't allow me to set a default value in one line.
I ended up doing
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE settings_new (foo INTEGER NOT NULL, bar TEXT NOT NULL, PRIMARY KEY(foo))")
database.execSQL("INSERT INTO settings_new (foo, bar) SELECT foo, '[]' AS bar FROM settings")
database.execSQL("DROP TABLE settings")
database.execSQL("ALTER TABLE settings_new RENAME TO settings")
}
}
In other words
Create a new temporary table (settings_new)
Move old values into the new one. Notice that we set bar as an empty array as default.
Drop the original (settings) table
Rename the temporary to the old name (i.e. settings_new --> settings)
Try to change settings table name Settings and you pass only setting..
database.execSQL("ALTER TABLE Settings ADD COLUMN bar TEXT")
after add..
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.addMigrations(MIGRATION_1_2)
.build();
refer this ..
Room database migration if only new table is added

Android Room Migration: Update Attribute Name By Creating New Table

Issue
In my project I a have a room table named 'content' with a Double attribute 'archivedCount'. In the latest version of the app the attribute archivedCount attribute is re-named to dismissCount, still as type Double.
Android API Level / SQL Version
28 / 3.19
Original Content model
#Entity(tableName = "content")
data class Content(#PrimaryKey var id: String, var archiveCount: Double) : Parcelable {...}
New Content model
#Entity(tableName = "content")
data class Content(#PrimaryKey var id: String, var dismissCount: Double) : Parcelable {...}
Runtime error
java.lang.IllegalStateException: Migration didn't properly handle content(app.coinverse.content.models.Content).
I've inspected the Expected and Found tables the log prints and they appear to be identical.
Attempted Solution
I attempted the complex schema change as outlined by a Google Developer Advocate unsuccessfully in order to modify the name of one attribute / column. Here is a basic version of what I attempted. 
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// Create the new table
database.execSQL("CREATE TABLE content_new (id TEXT, dismissCount REAL, PRIMARY KEY(id))")
// Copy the data
database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM content")
// Remove the old table
database.execSQL("DROP TABLE content")
// Change the table name to the correct one
database.execSQL("ALTER TABLE content_new RENAME TO content")
}
}
Can't see anything wrong with your implementation, I would suggest that you use a different #Entity class that is not named Content() and try again.

Categories

Resources