package Ġyet . orm Ċ Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġyet . database . Sqlite Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġent ao yang @ 1 6 3 . com Ġon Ġ 2 0 1 7 - 0 3 - 0 7 . Ċ Ġ*/ Ċ Ċ internal Ġobject ĠTable Creator Ġ{ Ċ ĉ val Ġchecked Set Ġ= ĠHashSet < String >() Ċ ĉ fun Ġcheck ( db : ĠSQLite Database , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ synchronized ( checked Set ) Ġ{ Ċĉĉ ĉ val Ġk Ġ= Ġdb . path Ġ+ Ġ"@ " Ġ+ Ġmi . tableName Ċĉĉ ĉ if Ġ( k Ġin Ġchecked Set ) Ġ{ Ċĉĉĉ ĉ return Ċĉĉ ĉ } Ċĉĉ ĉ checked Set . add ( k ) Ċĉĉ ĉ do Check ( db , Ġmi ) Ċĉ ĉ } ĊĊ ĉ } ĊĊ ĉ private Ġfun Ġdo Check ( db : ĠSQLite Database , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ val ĠL Ġ= ĠSql ite ( db ) Ċĉ ĉ if Ġ( L . exist Table ( mi . tableName )) Ġ{ Ċĉĉ ĉ L . transaction Ġ{ Ċĉĉĉ ĉ check Table ( L , Ġmi ) Ċĉĉĉ ĉ check Index ( L , Ġmi ) Ċĉĉ ĉ } Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ L . transaction Ġ{ Ċĉĉĉ ĉ createTable ( L , Ġmi ) Ċĉĉĉ ĉ create Index ( L , Ġmi ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġcheck Table ( L : ĠSql ite , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ if Ġ(! mi . auto Alter Table ) Ġ{ Ċĉĉ ĉ return Ċĉ ĉ } Ċĉ ĉ val Ġset Ġ= ĠL . table Info ( mi . tableName ). map Ġ{ Ġit . name Ġ}. toSet () Ċĉ ĉ for Ġ( p Ġin Ġmi . all Prop ) Ġ{ Ċĉĉ ĉ if Ġ( p . short Name Ġ! in Ġset ) Ġ{ Ċĉĉĉ ĉ L . addColumn ( mi . tableName , Ġp . define Column ( true )) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġcheck Index ( L : ĠSql ite , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ val Ġset Ġ= ĠL . index s Of ( mi . tableName ) Ċĉ ĉ for Ġ( p Ġin Ġmi . all Prop ) Ġ{ Ċĉĉ ĉ if Ġ( p . is PrimaryKey Ġ|| Ġp . unique Ġ|| Ġ! p . index ) Ġ{ Ċĉĉĉ ĉ continue Ċĉĉ ĉ } Ċĉĉ ĉ val Ġindex Name Ġ= ĠL . index Name Of ( mi . tableName , Ġp . short Name ) Ċĉĉ ĉ if Ġ( index Name Ġ! in Ġset ) Ġ{ Ċĉĉĉ ĉ L . create Index ( mi . tableName , Ġp . short Name ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġcreate Table ( L : ĠSql ite , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ val Ġls Ġ= ĠArrayList < String >( 1 2 ) Ċĉ ĉ val Ġpk Cols Ġ= Ġmi . all PK Ċĉ ĉ mi . all Prop . map To ( ls ) Ġ{ Ġit . define Column ( pk Cols . size Ġ< Ġ 2 ) Ġ} Ċĉ ĉ if Ġ( pk Cols . size Ġ>= Ġ 2 ) Ġ{ Ċĉĉ ĉ val Ġs Ġ= Ġpk Cols . map Ġ{ Ġit . short Name Ġ}. join ToString (",") Ċĉĉ ĉ ls . add (" PRIMARY ĠKEY Ġ($ s )") Ċĉ ĉ } ĊĊĉ ĉ val Ġu Map Ġ= Ġmi . all Prop . filter Ġ{ Ġit . unique Ġ&& Ġit . unique Name . isNotEmpty () Ġ}. groupBy Ġ{ Ġit . unique Name Ġ} Ċĉ ĉ for Ġ(( k , Ġv ) Ġin Ġu Map ) Ġ{ Ċĉĉ ĉ val Ġcs Ġ= Ġv . join ToString (",") Ġ{ Ġit . short Name Ġ} Ċĉĉ ĉ ls . add (" CONSTRAINT Ġ$ k ĠUNIQUE Ġ($ cs )") Ċĉ ĉ } ĊĊĉ ĉ if Ġ( mi . uni ques . isNotEmpty ()) Ġ{ Ċĉĉ ĉ val Ġs Ġ= Ġ" CONSTRAINT Ġ" Ġ+ Ġmi . uni ques . join ToString ("_ ") Ġ+ Ġ" ĠUNIQUE Ġ(" Ġ+ Ġmi . uni ques . join ToString (",") Ġ+ Ġ")" Ċĉĉ ĉ ls . add ( s ) Ċĉ ĉ } Ċĉ ĉ L . createTable ( mi . tableName , Ġls ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġcreate Index ( L : ĠSql ite , Ġmi : ĠModel Info ) Ġ{ Ċĉ ĉ for Ġ( p Ġin Ġmi . all Prop ) Ġ{ Ċĉĉ ĉ if Ġ( p . is PrimaryKey Ġ|| Ġp . unique Ġ|| Ġ! p . index ) Ġ{ Ċĉĉĉ ĉ continue Ċĉĉ ĉ } Ċĉĉ ĉ L . create Index ( mi . tableName , Ġp . short Name ) Ċĉ ĉ } Ċ ĉ } ĊĊ Ċ }