@@ -23,6 +23,7 @@ public class DatabaseGenerator {
2323
2424 private static final String BULK_STRING_VALUE = " String value;\n " ;
2525 private static final String PRIMARY_KEY_FORMAT = " + \" , PRIMARY KEY (\" + %1$s + \" )\" " ;
26+ private static final String UNIQUE_FORMAT = " + \" , UNIQUE (\" + %1$s + \" )\" " ;
2627
2728 private static final String URI_TYPE_FORMAT =
2829 " %1$s%2$s(%3$s.TABLE_NAME%4$s, %3$s.TABLE_NAME, %3$s.%5$s)%6$s\n " ;
@@ -100,11 +101,13 @@ private static void generateContentClass(final String fileName, final String cla
100101 final StringBuilder sbProjection = new StringBuilder ();
101102 final StringBuilder sbCreateTable = new StringBuilder ();
102103 final StringBuilder sbCreateTablePrimaryKey = new StringBuilder ();
104+ final StringBuilder sbCreateTableUnique = new StringBuilder ();
103105 final StringBuilder sbUpgradeTableComment = new StringBuilder ();
104106 final StringBuilder sbUpgradeTableCommentNewFields = new StringBuilder ();
105107 final StringBuilder sbUpgradeTable = new StringBuilder ();
106108 final StringBuilder sbUpgradeTableCreateTmpTable = new StringBuilder ();
107109 final StringBuilder sbUpgradeTableCreateTmpTablePrimaryKey = new StringBuilder ();
110+ final StringBuilder sbUpgradeTableCreateTmpTableUnique = new StringBuilder ();
108111 final StringBuilder sbUpgradeTableInsertFields = new StringBuilder ();
109112 final StringBuilder sbUpgradeTableInsertDefaultValues = new StringBuilder ();
110113 final StringBuilder sbIndexes = new StringBuilder ();
@@ -113,6 +116,7 @@ private static void generateContentClass(final String fileName, final String cla
113116 final StringBuilder sbBulkValues = new StringBuilder ();
114117
115118 boolean hasPreviousPrimaryKey , hasAutoIncrementPrimaryKey , hasPreviousInsertFields ;
119+ boolean hasPreviousUnique ;
116120 boolean hasPreviousInsertDefaultValues , hasTextField ;
117121 boolean hasPreviousUpgradeElements ;
118122 int maxUpgradeVersion , minUpgradeWithoutChanges ;
@@ -129,11 +133,12 @@ private static void generateContentClass(final String fileName, final String cla
129133 sbBulkParams .setLength (0 );
130134 sbBulkValues .setLength (0 );
131135 hasPreviousPrimaryKey = false ;
136+ hasPreviousUnique = false ;
132137 hasAutoIncrementPrimaryKey = false ;
133138 hasTextField = false ;
134139
135140 for (int i = 0 , n = tableData .fieldList .size (); i < n ; i ++) {
136- final FieldData fieldData = tableData .fieldList .get (i );
141+ FieldData fieldData = tableData .fieldList .get (i );
137142
138143 final boolean isNotLast = i != n - 1 ;
139144
@@ -159,6 +164,10 @@ private static void generateContentClass(final String fileName, final String cla
159164 .append (fieldData .dbConstantName ).append (".getName() + \" \" + " )
160165 .append ("Columns." )
161166 .append (fieldData .dbConstantName ).append (".getType()" );
167+ if (fieldData .dbDefaultValue != null ) {
168+ sbCreateTable .append (" + \" DEFAULT " ).append (fieldData .dbDefaultValue )
169+ .append ("\" " );
170+ }
162171 if (fieldData .dbIsPrimaryKey ) {
163172 if (fieldData .dbIsAutoincrement ) {
164173 if (hasPreviousPrimaryKey ) {
@@ -183,6 +192,15 @@ private static void generateContentClass(final String fileName, final String cla
183192 }
184193 }
185194
195+ if (fieldData .dbIsUnique ) {
196+ if (hasPreviousUnique ) {
197+ sbCreateTableUnique .append (" + \" , \" + " );
198+ }
199+ hasPreviousUnique = true ;
200+ sbCreateTableUnique .append ("Columns." )
201+ .append (fieldData .dbConstantName ).append (".getName()" );
202+ }
203+
186204 if (fieldData .dbHasIndex ) {
187205 sbIndexes .append (TAB3 )
188206 .append ("db.execSQL(\" CREATE INDEX " )
@@ -233,8 +251,8 @@ private static void generateContentClass(final String fileName, final String cla
233251 maxUpgradeVersion = tableData .version ;
234252 minUpgradeWithoutChanges = -1 ;
235253 for (int curVers = tableData .version + 1 ; curVers <= dbVersion ; curVers ++) {
236- final List <FieldData > upgradeFieldDataList = tableData . upgradeFieldMap
237- .get (curVers );
254+ List <FieldData > upgradeFieldDataList =
255+ tableData . upgradeFieldMap .get (curVers );
238256 if (upgradeFieldDataList == null ) {
239257 if (minUpgradeWithoutChanges == -1 ) {
240258 minUpgradeWithoutChanges = curVers ;
@@ -282,12 +300,41 @@ private static void generateContentClass(final String fileName, final String cla
282300 .append (fieldData .dbConstantName ).append (".getName() + \" \" + " )
283301 .append ("Columns." ).append (fieldData .dbConstantName )
284302 .append (".getType()" );
303+ if (fieldData .dbDefaultValue != null ) {
304+ sbUpgradeTableCreateTmpTable .append (" + \" DEFAULT " )
305+ .append (fieldData .dbDefaultValue ).append ("\" " );
306+ }
285307 if (fieldData .dbIsPrimaryKey ) {
286- if (hasPreviousPrimaryKey ) {
287- sbUpgradeTableCreateTmpTablePrimaryKey .append (" + \" , \" + " );
308+ if (fieldData .dbIsAutoincrement ) {
309+ if (hasPreviousPrimaryKey ) {
310+ throw new IllegalArgumentException ("Not possible to have " +
311+ "multiple primary key fields if one of them is an " +
312+ "autoincrement field" );
313+ } else {
314+ hasAutoIncrementPrimaryKey = true ;
315+ sbUpgradeTableCreateTmpTable
316+ .append ("+ \" PRIMARY KEY AUTOINCREMENT\" " );
317+ }
318+ } else if (hasAutoIncrementPrimaryKey ) {
319+ throw new IllegalArgumentException ("Not possible to have multiple" +
320+ " primary key fields if one of them is an autoincrement " +
321+ "field" );
322+ } else {
323+ if (hasPreviousPrimaryKey ) {
324+ sbUpgradeTableCreateTmpTablePrimaryKey .append (" + \" , \" + " );
325+ }
326+ hasPreviousPrimaryKey = true ;
327+ sbUpgradeTableCreateTmpTablePrimaryKey .append ("Columns." )
328+ .append (fieldData .dbConstantName ).append (".getName()" );
288329 }
289- hasPreviousPrimaryKey = true ;
290- sbUpgradeTableCreateTmpTablePrimaryKey .append ("Columns." )
330+ }
331+
332+ if (fieldData .dbIsUnique ) {
333+ if (hasPreviousUnique ) {
334+ sbUpgradeTableCreateTmpTableUnique .append (" + \" , \" + " );
335+ }
336+ hasPreviousUnique = true ;
337+ sbUpgradeTableCreateTmpTableUnique .append ("Columns." )
291338 .append (fieldData .dbConstantName ).append (".getName()" );
292339 }
293340
@@ -315,11 +362,12 @@ private static void generateContentClass(final String fileName, final String cla
315362 }
316363
317364 sbUpgradeTable .append (String .format (
318- contentSubClassUpgrade ,
319- curVers ,
365+ contentSubClassUpgrade , curVers ,
320366 sbUpgradeTableCreateTmpTable .toString (),
321367 hasPreviousPrimaryKey ? String .format (PRIMARY_KEY_FORMAT ,
322368 sbUpgradeTableCreateTmpTablePrimaryKey .toString ()) : "" ,
369+ hasPreviousUnique ? String .format (UNIQUE_FORMAT ,
370+ sbUpgradeTableCreateTmpTableUnique .toString ()) : "" ,
323371 sbUpgradeTableInsertFields .toString (),
324372 sbUpgradeTableInsertDefaultValues .toString ()));
325373
@@ -366,7 +414,9 @@ private static void generateContentClass(final String fileName, final String cla
366414 sbProjection .toString (),
367415 sbCreateTable .toString (),
368416 hasPreviousPrimaryKey ? String .format (PRIMARY_KEY_FORMAT ,
369- sbCreateTablePrimaryKey .toString ()) : "" , sbIndexes .toString (),
417+ sbCreateTablePrimaryKey .toString ()) : "" ,
418+ hasPreviousUnique ? String .format (UNIQUE_FORMAT ,
419+ sbCreateTableUnique .toString ()) : "" , sbIndexes .toString (),
370420 sbBulkFields .toString (), sbBulkParams .toString (),
371421 hasTextField ? BULK_STRING_VALUE : "" , sbBulkValues .toString (),
372422 tableData .version , sbUpgradeTableComment .toString (), sbUpgradeTable
0 commit comments