public async Task RunMigrations()
    {
        // TODO run migrations in a transaction, otherwise, if and error is found, the app could stay in a horrible state

        if (settings.DatabaseVersion < migrations.Count)
        {
            var connection = new SQLiteAsyncConnection(() => sqlite.GetConnectionWithLock());

            while (settings.DatabaseVersion < migrations.Count)
            {
                var nextVersion = settings.DatabaseVersion + 1;
                var success     = await migrations[nextVersion - 1].UseConnection(connection).Run();

                if (success)
                {
                    settings.DatabaseVersion = nextVersion;
                }
                else
                {
                    MvxTrace.Error("Migration process stopped after error found at {0}", migrations[nextVersion - 1].GetType().Name);
                    break;
                }
            }
        }
    }