package Ġorg . db tools . android . room . jdbc Ċ Ċ object ĠJdbc Database Util Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġif Ġa Ġcolumn Ġin Ġa Ġdatabase Ġexists , Ġif Ġit Ġdoes Ġnot ... Ġalter Ġquery Ġwill Ġbe Ġrun ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSql ite Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName Ġtable Ġfor ĠcolumnName ĊĠĠĠĠ Ġ* Ġ@ param ĠcolumnName Ġcolumn Ġto Ġfrom ĠtableName Ġto Ġbe Ġchecked ĊĠĠĠĠ Ġ* Ġ@ param Ġalter Sql ĠSQL Ġto Ġbe Ġrun Ġif Ġthe Ġcolumn Ġdoes Ġnot Ġexits . ĠExample : Ġalter Table If Column DoesNotExist ( database , Ġ" individual ", Ġ" middle _ name ", Ġ" ALTER ĠTABLE Ġindividual ĠADD Ġ` middle _ name ` ĠTEXT ĠDEFAULT Ġ'' ĠNOT ĠNULL ") ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthere Ġwere Ġno Ġfailures ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġalter Table If Column DoesNotExist ( database : ĠJdbc Sqlite Database , ĠtableName : ĠString , ĠcolumnName : ĠString , Ġalter Sql : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! table Exists ( database , ĠtableName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Cannot ĠALTER Ġtable Ġ[$ tableName ] Ġthat Ġdoes Ġnot Ġexist Ġin Ġdatabase Ġ[ ${ database . path }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! column Exists ( database , ĠtableName , ĠcolumnName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL ( alter Sql ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġif Ġa Ġtable Ġin Ġa Ġdatabase Ġexists ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSql ite Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName ĠtableName Ġto Ġfrom Ġdatabase Ġto Ġbe Ġchecked ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġtable Ġexists Ġotherwise Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtable Exists ( database : ĠJdbc Sqlite Database , ĠtableName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtable Exists Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġdatabase . query (" SELECT Ġcount ( 1 ) ĠFROM Ġsqlite _ master ĠWHERE Ġtype =' table ' ĠAND Ġname ='$ tableName '", Ġnull ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcursor . getInt ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Exists Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Query : Ġ[ SELECT Ġcount ( 1 ) ĠFROM Ġsqlite _ master ĠWHERE Ġtype =' table ' ĠAND Ġname ='$ tableName '] Ġreturned ĠNO Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtable Exists ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġto Ġsee Ġif Ġa Ġcolumn Ġin Ġa Ġdatabase Ġexists ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSql ite Ġdatabase ĊĠĠĠĠ Ġ* Ġ@ param ĠtableName Ġtable Ġfor ĠcolumnName ĊĠĠĠĠ Ġ* Ġ@ param ĠcolumnName Ġcolumn Ġto Ġfrom ĠtableName Ġto Ġbe Ġchecked ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġcolumn Ġexists Ġotherwise Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcolumn Exists ( database : ĠJdbc Sqlite Database , ĠtableName : ĠString , ĠcolumnName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcolumn Exists Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġdatabase . query (" PR AG MA Ġtable _ info ($ tableName )", Ġnull ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Column Ġ= Ġcursor . getString ( cursor . getColumnIndex OrThrow (" name ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Column Ġ== ĠcolumnName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Exists Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! column Exists Ġ&& Ġcursor . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Query : Ġ[ PR AG MA Ġtable _ info ($ tableName )] Ġreturned ĠNO Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcolumn Exists ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġroom Ġmaster Ġtable Ġand Ġset Ġthe Ġdatabase Ġversion Ġ( default Ġ 0 ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSQLite ĠDatabase ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Version Ġversion Ġto Ġbe Ġset Ġon Ġdatabase Ġ( default Ġto Ġ 0 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset Room ( database : ĠJdbc Sqlite Database , Ġnew Version : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" DROP ĠTABLE ĠIF ĠEXISTS Ġroom _ master _ table ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġdatabase . version Ġ= Ġnew Version ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġdatabase Ġshould ĠNOT Ġhave Ġa Ġmigration Ġand Ġis Ġa Ġpre - pop ulated Ġdatabase Ġthat Ġshould Ġnot Ġbe Ġmanaged Ġby ĠRoom ... Ġmake Ġsure ĠRoom Ġmigration Ġis Ġnever Ġneeded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSQLite ĠDatabase ĊĠĠĠĠ Ġ* Ġ@ param Ġexpected Version ĠSQLite ĠDatabase Ġversion Ġ( PR AG MA Ġuser _ version ) ĊĠĠĠĠ Ġ* Ġ@ param Ġexpected Identity Hash ĠHash Ġthat Ġis Ġexpected . Ġ ĠIf Ġthe Ġexpected Identity Hash Ġdoes Ġnot Ġmatch Ġthe Ġexisting Ġidentity Ġhash Ġ( currently Ġin Ġthe Ġroom _ master _ table ), Ġthen Ġjust Ġdelete Ġthe Ġtable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck And Fix Room Identity Hash ( database : ĠJdbc Sqlite Database , Ġexpected Version : ĠInt , Ġexpected Identity Hash : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expected Identity Hash . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" check And Fix Room Identity Hash Ġ-- Ġexpected Identity Hash Ġis Ġblank ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġdatabase Ġversion ĊĠĠĠĠĠĠĠ Ġif Ġ( database . version Ġ!= Ġexpected Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . version Ġ= Ġexpected Version ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġalready Ġhave Ġthe Ġcorrect Ġidentity Ġhash ĊĠĠĠĠĠĠĠ Ġif Ġ( table Exists ( database , Ġ" room _ master _ table ") Ġ&& Ġfind Room Identity Hash ( database ) Ġ== Ġexpected Identity Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare ĠOK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" check And Fix Room Identity Hash Ġ-- Ġupdating Ġexpected Identity Hash : Ġ[$ expected Identity Hash ]") ĊĠĠĠĠĠĠĠ Ġdatabase . beginTransaction () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġroom _ master _ table Ġ( id ĠINTEGER ĠPRIMARY ĠKEY , identity _ hash ĠTEXT )", Ġempty Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" INSERT ĠOR ĠREPLACE ĠINTO Ġroom _ master _ table Ġ( id , identity _ hash ) ĠVALUES ( 4 2 , Ġ'$ expected Identity Hash ') ", Ġempty Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . set Transaction Successful () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . end Transaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe ĠRoom ĠIdentity ĠHash ĊĠĠĠĠ Ġ* ĠNote : Ġif Ġyou Ġare Ġnot Ġsure Ġif Ġthe Ġroom _ master _ table Ġexists , Ġcheck Ġfirst Ġwith Ġtable Exists ( database , Ġ" room _ master _ table ") ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdatabase ĠSQLite ĠDatabase ĊĠĠĠĠ Ġ* Ġ@ return Ġidentity _ hash Ġfor Ġthis Ġdatabase ĠOR Ġnull Ġif Ġit Ġdoes Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Room Identity Hash ( database : ĠJdbc Sqlite Database ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġidentity Hash : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : Ġthe Ġid Ġcolumn Ġfor Ġthis Ġtable Ġalways Ġseems Ġto Ġbe Ġ 4 2 Ġand Ġthere Ġis Ġalways Ġonly Ġ 1 Ġrow ... Ġso Ġlets Ġjust Ġfind Ġthe Ġfirst Ġrow ĊĠĠĠĠĠĠĠ Ġdatabase . query (" SELECT Ġidentity _ hash ĠFROM Ġroom _ master _ table ĠLIMIT Ġ 1 ", Ġnull ). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcolumnIndex Ġ= Ġcursor . getColumnIndex (" identity _ hash ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentity Hash Ġ= Ġif Ġ( column Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoes Ġnot Ġexist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( column Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Query : Ġ[ SELECT Ġidentity _ hash ĠFROM Ġroom _ master _ table ĠLIMIT Ġ 1 ] Ġreturned ĠNO Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġidentity Hash ĊĠĠĠ Ġ} Ċ }