Skip to content

Commit

Permalink
[DB] prepackaged dbs now can run migrations to get to current version…
Browse files Browse the repository at this point in the history
… when db version is 0 but we set our db version to something higher.
  • Loading branch information
agrosner committed Feb 18, 2021
1 parent bd5305e commit e9e2651
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,25 @@ import com.dbflow5.config.OpenHelperCreator
*/
open class AndroidSQLiteOpenHelper(
private val context: Context,
databaseDefinition: DBFlowDatabase,
dbFlowDatabase: DBFlowDatabase,
listener: DatabaseCallback?,
private val databaseHelperDelegate: DatabaseHelperDelegate = DatabaseHelperDelegate(context, listener, databaseDefinition,
if (databaseDefinition.backupEnabled()) {
private val databaseHelperDelegate: DatabaseHelperDelegate = DatabaseHelperDelegate(context, listener, dbFlowDatabase,
if (dbFlowDatabase.backupEnabled()) {
// Temp database mirrors existing
BackupHelper(context,
DatabaseHelperDelegate.getTempDbFileName(databaseDefinition),
databaseDefinition.databaseVersion, databaseDefinition)
DatabaseHelperDelegate.getTempDbFileName(dbFlowDatabase),
dbFlowDatabase.databaseVersion, dbFlowDatabase)
} else null),
) : SQLiteOpenHelper(
context,
if (databaseDefinition.isInMemory) null else databaseDefinition.databaseFileName,
if (dbFlowDatabase.isInMemory) null else dbFlowDatabase.databaseFileName,
null,
databaseDefinition.databaseVersion,
dbFlowDatabase.databaseVersion,
), OpenHelper, OpenHelperDelegate by databaseHelperDelegate {


private var androidDatabase: AndroidDatabase? = null
private val _databaseName = databaseDefinition.databaseFileName
private val _databaseName = dbFlowDatabase.databaseFileName

override val database: DatabaseWrapper
get() {
Expand Down
4 changes: 3 additions & 1 deletion lib/src/main/kotlin/com/dbflow5/database/DatabaseHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ open class DatabaseHelper(private val migrationFileHelper: MigrationFileHelper,
executeTableCreations(db)

// execute any initial migrations when DB is first created.
executeMigrations(db, -1, db.version)
// use the databaseversion of the definition, since onupgrade is not called oncreate on a version 0
// then SQLCipher and Android set the DB to that version you choose.
executeMigrations(db, -1, databaseDefinition.databaseVersion)

// views reflect current db state.
executeViewCreations(db)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ class DatabaseHelperDelegate(
context.assets.open(prepackagedName)
}
writeDB(dbPath, inputStream)
databaseDefinition.reopen()
} catch (e: IOException) {
FlowLog.log(FlowLog.Level.W, "Failed to open file", e)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,49 @@ package com.dbflow5.prepackaged

import com.dbflow5.annotation.Column
import com.dbflow5.annotation.Database
import com.dbflow5.annotation.Migration
import com.dbflow5.annotation.PrimaryKey
import com.dbflow5.annotation.Table
import com.dbflow5.config.DBFlowDatabase
import com.dbflow5.database.DatabaseWrapper
import com.dbflow5.migration.AlterTableMigration
import com.dbflow5.migration.BaseMigration
import com.dbflow5.sql.SQLiteType
import com.dbflow5.structure.BaseModel

@Database(version = 1)
abstract class PrepackagedDB : DBFlowDatabase()

@Table(database = PrepackagedDB::class, allFields = true)
class Dog : BaseModel() {
@Database(version = 2)
abstract class MigratedPrepackagedDB : DBFlowDatabase() {

@Migration(version = 2, database = MigratedPrepackagedDB::class, priority = 1)
class AddNewFieldMigration : AlterTableMigration<Dog2>(Dog2::class) {
override fun onPreMigrate() {
addColumn(SQLiteType.TEXT, "newField")
}
}

@PrimaryKey
var id: Int = 0
@Migration(version = 2, database = MigratedPrepackagedDB::class, priority = 2)
class AddSomeDataMigration : BaseMigration() {
override fun migrate(database: DatabaseWrapper) {
Dog2(breed = "NewBreed", newField = "New Field Data").insert(database)
}
}

@Column
var breed: String? = null
}

@Table(database = PrepackagedDB::class, allFields = true)
class Dog(
@PrimaryKey var id: Int = 0,
@Column var breed: String? = null,
@Column var color: String? = null,
) : BaseModel()

@Column
var color: String? = null
}
@Table(database = MigratedPrepackagedDB::class, allFields = true, name = "Dog")
class Dog2(
@PrimaryKey var id: Int = 0,
@Column var breed: String? = null,
@Column var color: String? = null,
@Column var newField: String? = null,
) : BaseModel()
Original file line number Diff line number Diff line change
@@ -1,21 +1,50 @@
package com.dbflow5.prepackaged

import com.dbflow5.BaseUnitTest
import com.dbflow5.config.databaseForTable
import com.dbflow5.DBFlowInstrumentedTestRule
import com.dbflow5.DemoApp
import com.dbflow5.config.database
import com.dbflow5.database.AndroidSQLiteOpenHelper
import com.dbflow5.query.select
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test

/**
* Description: Asserts our prepackaged DB loads.
*/
class PrepackagedDBTest : BaseUnitTest() {
class PrepackagedDBTest {

@JvmField
@Rule
var dblflowTestRule = DBFlowInstrumentedTestRule.create {
database<PrepackagedDB>({
databaseName("prepackaged")
}, AndroidSQLiteOpenHelper.createHelperCreator(DemoApp.context))
database<MigratedPrepackagedDB>({
databaseName("prepackaged_2")
}, AndroidSQLiteOpenHelper.createHelperCreator(DemoApp.context))
}

@Test
fun assertWeCanLoadFromDB() {
databaseForTable<Dog> { dbFlowDatabase ->
val list = (select from Dog::class).queryList(dbFlowDatabase)
assertTrue(!list.isEmpty())
database<PrepackagedDB> { db ->
val list = (select from Dog::class).queryList(db)
assertTrue(list.isNotEmpty())
}
}

@Test
fun assertWeCanLoadFromDBPostMigrate() {
database<MigratedPrepackagedDB> { db ->
val list = (select from Dog2::class).queryList(db)
assertTrue(list.isNotEmpty())

val newData = (select
from Dog2::class
where Dog2_Table.breed.eq("NewBreed")
and Dog2_Table.newField.eq("New Field Data"))
.querySingle(db)
assertTrue(newData != null)
}
}
}
Binary file added tests/src/main/assets/prepackaged_2.db
Binary file not shown.

0 comments on commit e9e2651

Please sign in to comment.