package Ġcom . android training . personal r utine app . data Base Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . room . Database Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . Type Converters Ċ import Ġandroidx . room . migration . Migration Ċ import Ġandroidx . sqlite . db . Support SQLite Database Ċ import Ġcom . android training . personal r utine app . converter . Converters Ċ import Ġcom . android training . personal r utine app . converter . Date Type Converter Ċ import Ġcom . android training . personal r utine app . converter . List Converter Ċ import Ġcom . android training . personal r utine app . dao . Exercise Dao Ċ import Ġcom . android training . personal r utine app . dao . Routine Dao Ċ import Ġcom . android training . personal r utine app . dao . Tra ine e Dao Ċ import Ġcom . android training . personal r utine app . entity . Exercise Ċ import Ġcom . android training . personal r utine app . entity . Gender Ċ import Ġcom . android training . personal r utine app . entity . Routine Ċ import Ġcom . android training . personal r utine app . entity . Tra ine e Ċ Ċ @ Database ( ĊĠĠĠ Ġentities Ġ= Ġ[ Exercise :: class , ĠRout ine :: class , ĠTra ine e :: class ], ĊĠĠĠ Ġversion Ġ= Ġ 2 , ĊĠĠĠ Ġexport Schema Ġ= Ġtrue Ċ ) Ċ @ Type Converters ( Date Type Converter :: class , ĠList Converter :: class , ĠConverter s :: class ) Ċ abstract Ġclass ĠApp Database Ġ: ĠRoom Database () Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġexercise Dao (): ĠExercise Dao ĊĠĠĠ Ġabstract Ġfun Ġroutine Dao (): ĠRout ine Dao ĊĠĠĠ Ġabstract Ġfun Ġtra ine e Dao (): ĠTra ine e Dao ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠINSTANCE : ĠApp Database ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġget AppData Base ( context : ĠContext ): ĠApp Database Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( App Database :: class ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠRoom . database Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Database :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" my DB " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Migrations ( M IG RATION _ 1 _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdestroy Data Base (){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM IG RATION _ 1 _ 2 Ġ= Ġobject Ġ: ĠMigration ( 1 , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ` temp _ tra ine e ` Ġ(` name ` ĠTEXT ĠNOT ĠNULL , Ġ` age ` ĠINTEGER ĠNOT ĠNULL , Ġ` gender ` ĠTEXT ĠNOT ĠNULL , Ġ` id ` ĠINTEGER ĠPRIMARY ĠKEY ĠAUTO INCREMENT ĠNOT ĠNULL , Ġ` routine Id ` ĠINTEGER ĠNOT ĠNULL , Ġ` due _ day ` ĠINTEGER ĠNOT ĠNULL , Ġ` exercises ` ĠTEXT ĠNOT ĠNULL )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Tra ine e Queries Ġ= Ġdatabase . query (" SELECT Ġ* ĠFROM Ġtra ine e "). use Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtra ine es Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cursor . moveTo First ()) Ġreturn @ use Ġtra ine es ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Name Ġ= Ġ" name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Age Ġ= Ġ" age " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Gender Ġ= Ġ" gender " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Id Ġ= Ġ" id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Routine Id Ġ= Ġ" routine Id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Routine Due Day Ġ= Ġ" due _ day " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Routine Ex ercises Ġ= Ġ" exercises " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcursor . getString ( cursor . getColumnIndex ( cn Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġage Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( cn Age )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgender Ġ= Ġif Ġ( cursor . getInt ( cursor . getColumnIndex ( cn Gender )) Ġ== Ġ 2 ) ĠGender . F EM ALE Ġelse ĠGender . M ALE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( cn Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroutine Id Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( cn Routine Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroutine Due Day Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( cn Routine Due Day )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroutine Ex ercises Ġ= Ġcursor . getString ( cursor . getColumnIndex ( cn Routine Ex ercises )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra ine es . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" INSERT ĠINTO Ġtemp _ tra ine e ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ($ cn Name , Ġ$ cn Age , Ġ$ cn Gender , Ġ$ cn Id , Ġ$ cn Routine Id , Ġ$ cn Routine Due Day , Ġ$ cn Routine Ex ercises ) ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| VALUES Ġ(' $ name ', Ġ$ age , Ġ'${ gender . name }', Ġ$ id , Ġ$ routine Id , Ġ$ routine Due Day , Ġ'$ routine Ex ercises '); """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ use Ġtra ine es ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( query Ġin Ġtemp Tra ine e Queries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" DROP ĠTABLE Ġtra ine e ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE Ġtemp _ tra ine e ĠR ENAME ĠTO Ġtra ine e ; ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" CREATE ĠINDEX ĠIF ĠNOT ĠEXISTS " Ġ+ Ġ( "" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ` index _ Tra ine e _ age ` ĠON Ġ Ġ' Tra ine e ' Ġ(` age `) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" CREATE ĠINDEX ĠIF ĠNOT ĠEXISTS " Ġ+ Ġ( "" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ` index _ Tra ine e _ name ` ĠON Ġ Ġ' Tra ine e ' Ġ(` name `) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }