Source code
KittyORM update example
1// Initializing database instance 2BasicDatabase db = new BasicDatabase(getContext()); 3// Getting mapper instance 4RandomMapper mapper = (RandomMapper) db.getMapper(RandomModel.class); 5// Getting existing model from database (assuming that 0l model exists) 6RandomModel toUpdate = mapper.findByIPK(0l); 7// Setting model fields 8toUpdate.randomInt = 12; 9... 10// Saving model with save method 11mapper.save(toUpdate); 12// Saving model with direct insert call 13mapper.update(toInsert);
1// Initializing database instance 2BasicDatabase db = new BasicDatabase(getContext()); 3// Getting mapper instance 4RandomMapper mapper = (RandomMapper) db.getMapper(RandomModel.class); 5// Creating condition builder instance 6SQLiteConditionBuilder builder = new SQLiteConditionBuilder(); 7builder.addColumn("id") 8 .addSQLOperator(SQLiteOperator.GREATER_OR_EQUAL) 9 .addValue(10) 10 .addSQLOperator(SQLiteOperator.AND) 11 .addColumn("id") 12 .addSQLOperator(SQLiteOperator.LESS_OR_EQUAL) 13 .addValue(20); 14// Creating blank model and setting it fields 15RandomModel toUpdate = new RandomModel(); 16toUpdate.randomInt = 50; 17// Updating table with custom clause and values from model 18mapper.update(toUpdate, builder.build(), new String[]{"randomInt"}, CVUtils.INCLUDE_ONLY_SELECTED_FIELDS);
KittyORM basic_database
implementation sources
Click to view
BasicDatabase.class
:1@KITTY_DATABASE( 2 databaseName = "basic_database", 3 domainPackageNames = {"net.akaish.kittyormdemo.sqlite.basicdb"}, 4 logTag = LOG_TAG, 5 isLoggingOn = true, 6 isProductionOn = true, 7 isPragmaOn = true 8) 9@KITTY_DATABASE_REGISTRY( 10 domainPairs = { 11 @KITTY_REGISTRY_PAIR(model = ComplexRandomModel.class, mapper = ComplexRandomMapper.class), 12 @KITTY_REGISTRY_PAIR(model = IndexesAndConstraintsModel.class), 13 @KITTY_REGISTRY_PAIR(model = RandomModel.class, mapper = RandomMapper.class) 14 } 15) 16public class BasicDatabase extends KittyDatabase { 17 18 public static final String LOG_TAG = "BASIC DB DEMO"; 19 20 /** 21 * KittyORM main database class that represents bootstrap and holder for all related with database 22 * components. 23 * <br> See {@link KittyDatabase#KittyDatabase(Context, String)} for more info. 24 * 25 * @param ctx 26 */ 27 public BasicDatabase(Context ctx) { 28 super(ctx); 29 } 30 31}
Click to view
AbstractRandomModel.class
:1public abstract class AbstractRandomModel extends KittyModel { 2 3 public static final String RND_INTEGER_CNAME = "rnd_int_custom_column_name"; 4 public static final String RND_ANIMAL_CNAME = "rndanimal"; 5 6 @KITTY_COLUMN( 7 isIPK = true, 8 columnOrder = 0 9 ) 10 public Long id; 11 12 @KITTY_COLUMN( 13 columnOrder = 1 14 ) 15 public int randomInt; 16 17 @KITTY_COLUMN( 18 columnOrder = 2, 19 columnName = RND_INTEGER_CNAME 20 ) 21 public Integer randomInteger; 22 23 @KITTY_COLUMN( 24 columnOrder = 3, 25 columnName = RND_ANIMAL_CNAME 26 ) 27 public Animals randomAnimal; 28 29 @KITTY_COLUMN( 30 columnOrder = 4, 31 columnAffinity = TypeAffinities.TEXT 32 ) 33 public String randomAnimalName; 34}
Click to view
RandomModel.class
:1@KITTY_TABLE 2@KITTY_EXTENDED_CRUD(extendedCrudController = RandomMapper.class) 3@INDEX( 4 indexName = "random_animal_index", 5 indexColumns = {AbstractRandomModel.RND_ANIMAL_CNAME} 6) 7public class RandomModel extends AbstractRandomModel { 8 9 10 public RandomModel() { 11 super(); 12 } 13 14 @KITTY_COLUMN(columnOrder = 5) 15 public String randomAnimalSays; 16 17 @Override 18 public String toString() { 19 return new StringBuffer(64).append("[ id = ") 20 .append(id) 21 .append("; randomInt = ") 22 .append(Integer.toString(randomInt)) 23 .append("; randomInteger = ") 24 .append(randomInteger) 25 .append("; randomAnimal = ") 26 .append(randomAnimal) 27 .append("; randomAnimnalLocalizedName = ") 28 .append(randomAnimalName) 29 .append("; randomAnimalSays = ") 30 .append(randomAnimalSays).append(" ]").toString(); 31 } 32}
Click to view
RandomMapper.class
:1package net.akaish.kittyormdemo.sqlite.basicdb; 2 3import net.akaish.kitty.orm.KittyMapper; 4import net.akaish.kitty.orm.KittyModel; 5import net.akaish.kitty.orm.configuration.conf.KittyTableConfiguration; 6import net.akaish.kitty.orm.query.QueryParameters; 7import net.akaish.kitty.orm.query.conditions.SQLiteCondition; 8import net.akaish.kitty.orm.query.conditions.SQLiteConditionBuilder; 9import net.akaish.kitty.orm.query.conditions.SQLiteOperator; 10import net.akaish.kitty.orm.util.KittyConstants; 11import net.akaish.kittyormdemo.sqlite.misc.Animals; 12 13import static net.akaish.kitty.orm.query.conditions.SQLiteOperator.AND; 14import static net.akaish.kitty.orm.query.conditions.SQLiteOperator.LESS_OR_EQUAL; 15import static net.akaish.kitty.orm.query.conditions.SQLiteOperator.LESS_THAN; 16import static net.akaish.kitty.orm.query.conditions.SQLiteOperator.GREATER_OR_EQUAL; 17import static net.akaish.kitty.orm.query.conditions.SQLiteOperator.GREATER_THAN; 18import static net.akaish.kittyormdemo.sqlite.basicdb.AbstractRandomModel.RND_ANIMAL_CNAME; 19 20import java.util.List; 21 22 23/** 24 * Created by akaish on 09.08.18. 25 * @author akaish (Denis Bogomolov) 26 */ 27public class RandomMapper extends KittyMapper { 28 29 public <M extends KittyModel> RandomMapper(KittyTableConfiguration tableConfiguration, 30 M blankModelInstance, 31 String databasePassword) { 32 super(tableConfiguration, blankModelInstance, databasePassword); 33 } 34 35 protected SQLiteCondition getAnimalCondition(Animals animal) { 36 return new SQLiteConditionBuilder() 37 .addColumn(RND_ANIMAL_CNAME) 38 .addSQLOperator("=") 39 .addObjectValue(animal) 40 .build(); 41 } 42 43 public long deleteByRandomIntegerRange(int start, int end) { 44 return deleteWhere("#?randomInt >= ? AND #?randomInt <= ?", start, end); 45 } 46 47 public long deleteByAnimal(Animals animal) { 48 return deleteWhere(getAnimalCondition(animal)); 49 } 50 51 public List<RandomModel> findByAnimal(Animals animal, long offset, long limit, boolean groupingOn) { 52 SQLiteCondition condition = getAnimalCondition(animal); 53 QueryParameters qparam = new QueryParameters(); 54 qparam.setLimit(limit).setOffset(offset); 55 if(groupingOn) 56 qparam.setGroupByColumns(RND_ANIMAL_CNAME); 57 else 58 qparam.setGroupByColumns(KittyConstants.ROWID); 59 return findWhere(condition, qparam); 60 } 61 62 public List<RandomModel> findByIdRange(long fromId, long toId, boolean inclusive, Long offset, Long limit) { 63 SQLiteCondition condition = new SQLiteConditionBuilder() 64 .addColumn("id") 65 .addSQLOperator(inclusive ? GREATER_OR_EQUAL : GREATER_THAN) 66 .addValue(fromId) 67 .addSQLOperator(AND) 68 .addColumn("id") 69 .addSQLOperator(inclusive ? LESS_OR_EQUAL : LESS_THAN) 70 .addValue(toId) 71 .build(); 72 QueryParameters qparam = new QueryParameters(); 73 qparam.setLimit(limit).setOffset(offset).setGroupByColumns(KittyConstants.ROWID); 74 return findWhere(condition, qparam); 75 } 76 77 public List<RandomModel> findAllRandomModels(Long offset, Long limit) { 78 QueryParameters qparam = new QueryParameters(); 79 qparam.setLimit(limit).setOffset(offset).setGroupByColumns(KittyConstants.ROWID); 80 return findAll(qparam); 81 } 82 83}
Click to view
ComplexRandomModel.class
:1@KITTY_TABLE 2@KITTY_EXTENDED_CRUD(extendedCrudController = ComplexRandomMapper.class) 3public class ComplexRandomModel extends AbstractRandomModel { 4 5 public ComplexRandomModel() { 6 super(); 7 } 8 9 10 // Primitives 11 // (boolean, int, byte, double, long, short, float) 12 @KITTY_COLUMN(columnOrder = 5) 13 public boolean boolF; 14 15 16 @KITTY_COLUMN(columnOrder = 6) 17 public byte byteF; 18 19 @KITTY_COLUMN(columnOrder = 7) 20 public double doubleF; 21 22 @KITTY_COLUMN(columnOrder = 8) 23 public long longF; 24 25 @KITTY_COLUMN(columnOrder = 9) 26 public short shortF; 27 28 @KITTY_COLUMN(columnOrder = 10) 29 public float floatF; 30 31 // Byte array 32 @KITTY_COLUMN(columnOrder = 11) 33 public byte[] byteArray; 34 35 // String (TEXT) (String, BigDecimal, BigInteger, Enum) 36 @KITTY_COLUMN(columnOrder = 12) 37 public String stringF; 38 39 @KITTY_COLUMN(columnOrder = 13) 40 public BigDecimal bigDecimalF; 41 42 @KITTY_COLUMN(columnOrder = 14) 43 public BigInteger bigIntegerF; 44 45 @KITTY_COLUMN(columnOrder = 15) 46 public Uri uriF; 47 48 @KITTY_COLUMN(columnOrder = 16) 49 public File fileF; 50 51 @KITTY_COLUMN(columnOrder = 17) 52 public Currency currencyF; 53 54 // SD 55 @KITTY_COLUMN( 56 columnOrder = 18, 57 columnAffinity = TypeAffinities.TEXT 58 ) 59 @KITTY_COLUMN_SERIALIZATION 60 public AnimalSounds stringSDF; 61 62 @KITTY_COLUMN(columnOrder = 19) 63 public SomeColours bitmapColour; 64 65 @KITTY_COLUMN( 66 columnOrder = 20, 67 columnAffinity = TypeAffinities.BLOB 68 ) 69 @KITTY_COLUMN_SERIALIZATION 70 public Bitmap byteArraySDF; 71 72 String stringSDFSerialize() { 73 if(stringSDF == null) return null; 74 return new GsonBuilder().create().toJson(stringSDF); 75 } 76 77 AnimalSounds stringSDFDeserialize(String cvData) { 78 if(cvData == null) return null; 79 if(cvData.length() == 0) return null; 80 return new GsonBuilder().create().fromJson(cvData, AnimalSounds.class); 81 } 82 83 public byte[] byteArraySDFSerialize() {//byteArraySDFSerialize 84 if(byteArraySDF == null) return null; 85 ByteArrayOutputStream bmpStream = new ByteArrayOutputStream(); 86 byteArraySDF.compress(Bitmap.CompressFormat.PNG, 100, bmpStream); 87 return bmpStream.toByteArray(); 88 } 89 90 public Bitmap byteArraySDFDeserialize(byte[] cursorData) { 91 if(cursorData == null) return null; 92 if(cursorData.length == 0) return null; 93 return BitmapFactory.decodeByteArray(cursorData, 0, cursorData.length); 94 } 95 96 // Primitive wrappers Boolean, Integer, Byte, Double, Short or Float 97 @KITTY_COLUMN(columnOrder = 21) 98 public Boolean boolFF; 99 100 101 @KITTY_COLUMN(columnOrder = 22) 102 public Byte byteFF; 103 104 @KITTY_COLUMN(columnOrder = 23) 105 public Double doubleFF; 106 107 @KITTY_COLUMN(columnOrder = 24) 108 public Short shortFF; 109 110 @KITTY_COLUMN(columnOrder = 25) 111 public Float floatFF; 112 113 114 // Long represented types Long, Date, Calendar, Timestamp 115 @KITTY_COLUMN(columnOrder = 26) 116 public Long longFF; 117 118 @KITTY_COLUMN(columnOrder = 27) 119 public Date dateF; 120 121 @KITTY_COLUMN(columnOrder = 28) 122 public Calendar calendarF; 123 124 @KITTY_COLUMN(columnOrder = 29) 125 public Timestamp timestampF; 126 127 @Override 128 public String toString() { 129 StringBuffer out = new StringBuffer(256); 130 out.append("Long id : "+id+"\r\n"); 131 out.append("int randomInt : "+randomInt+"\r\n"); 132 out.append("String stringF : "+stringF+"\r\n"); 133 out.append("BigInteger bigIntegerF : "+bigIntegerF+"\r\n"); 134 out.append("SomeColours bitmapColour : "+bitmapColour+"\r\n"); 135 out.append("Short shortFF : "+shortFF+"\r\n"); 136 out.append("Timestamp timestampF (HReadable) : "+timestampF+"\r\n"); 137 out.append("AnimalSounds stringSDF (HReadable) : "+stringSDFSerialize()+"\r\n"); 138 out.append("Uri uriF : " + uriF+"\r\n"); 139 out.append("Currency currencyF : " + currencyF.getSymbol()+"\r\n"); 140 out.append("... \r\n"); 141 return out.toString(); 142 } 143 144 public String toShortString() { 145 StringBuffer out = new StringBuffer(256); 146 out.append("[ Long id : "+id+"; "); 147 out.append("int randomInt : "+randomInt+"; "); 148 out.append("String stringF : "+stringF+"; "); 149 out.append("BigInteger bigIntegerF : "+bigIntegerF+"; "); 150 out.append("SomeColours bitmapColour : "+bitmapColour+"; "); 151 out.append("Short shortFF : "+shortFF+"; "); 152 out.append("Timestamp timestampF (HReadable) : "+timestampF+"; ... ]"); 153 return out.toString(); 154 } 155 156 @Deprecated 157 public String toHTMLString() { 158 StringBuffer out = new StringBuffer(2048); 159 out.append("<br>Long id : "+id.toString()+"\r\n"); 160 out.append("<br><b>PRIMITIVES</b>"+"\r\n"); 161 out.append("<br>boolean boolF : "+Boolean.toString(boolF)+"\r\n"); 162 out.append("<br>int randomInt : "+Integer.toString(randomInt)+"\r\n"); 163 out.append("<br>byte byteF : "+Byte.toString(byteF)+"\r\n"); 164 out.append("<br>double doubleF : "+Double.toString(doubleF)+"\r\n"); 165 out.append("<br>long longF : "+Long.toString(longF)+"\r\n"); 166 out.append("<br>short shortF : "+Short.toString(shortF)+"\r\n"); 167 out.append("<br>float floatF : "+Float.toString(floatF)+"\r\n"); 168 out.append("<br>byte[] byteArray : "+byteArrayToString(byteArray)+"\r\n"); 169 out.append("<br><b>STRING AFFINITIES</b>"+"\r\n"); 170 out.append("<br>String randomAnimalName : "+randomAnimalName+"\r\n"); 171 out.append("<br>String stringF : "+stringF+"\r\n"); 172 out.append("<br>BigDecimal bigDecimalF : "+bigDecimalF.toEngineeringString()+"\r\n"); 173 out.append("<br>BigInteger bigIntegerF : "+bigIntegerF.toString()+"\r\n"); 174 out.append("<br>Animals randomAnimal : "+randomAnimal.toString()+"\r\n"); 175 out.append("<br><b>SERIALIZATION AND DESERIALIZATION</b>"+"\r\n"); 176 out.append("<br>AnimalSounds stringSDF : "+stringSDFSerialize()+"\r\n"); 177 out.append("<br>SomeColours bitmapColour : "+bitmapColour.toString()+"\r\n"); 178 out.append("<br><b>PRIMITIVE WRAPPERS</b>"+"\r\n"); 179 out.append("<br>Boolean boolFF : "+boolFF.toString()+"\r\n"); 180 out.append("<br>Integer randomInteger : "+randomInteger.toString()+"\r\n"); 181 out.append("<br>Byte byteFF : "+byteFF.toString()+"\r\n"); 182 out.append("<br>Double doubleFF : "+doubleFF.toString()+"\r\n"); 183 out.append("<br>Short shortFF : "+shortFF.toString()+"\r\n"); 184 out.append("<br>Float floatFF :"+floatFF.toString()+"\r\n"); 185 out.append("<br><b>LONG REPRESENTED TYPES</b>"+"\r\n"); 186 out.append("<br>Long longFF : "+longFF.toString()+"\r\n"); 187 out.append("<br>Date dateF : "+Long.toString(dateF.getTime())+"\r\n"); 188 out.append("<br>Calendar calendarF : "+Long.toString(calendarF.getTimeInMillis())+"\r\n"); 189 out.append("<br>Timestamp timestampF : "+Long.toString(timestampF.getTime())+"\r\n"); 190 out.append("<br>Date dateF (HReadable) : "+dateF.toString()+"\r\n"); 191 out.append("<br>Calendar calendarF (HReadable) : "+calendarF.getTime().toString()+"\r\n"); 192 out.append("<br>Timestamp timestampF (HReadable) : "+timestampF.toString()+"\r\n"); 193 return out.toString(); 194 } 195 196 public String byteArrayToString(byte[] toString) { 197 String[] strings = new String[toString.length]; 198 for(int i = 0; i < toString.length; i++) { 199 strings[i] = Byte.toString(toString[i]); 200 } 201 return KittyUtils.implodeWithCommaInBKT(strings); 202 } 203}
Click to view
IndexesAndConstraintsModel.class
:1@KITTY_TABLE(tableName = "cai") 2@FOREIGN_KEY_T( 3 name = "CAI_FK", 4 columns = {IndexesAndConstraintsModel.RANDOM_ID_CNAME}, 5 reference = @FOREIGN_KEY_REFERENCE( 6 foreignTableName = "random", 7 foreignTableColumns = {"id"}, 8 onUpdate = OnUpdateDeleteActions.CASCADE, 9 onDelete = OnUpdateDeleteActions.CASCADE 10 ) 11) 12@INDEX(indexColumns = {"creation_date"}) 13public class IndexesAndConstraintsModel extends KittyModel { 14 static final String RANDOM_ID_CNAME = "rnd_id"; 15 16 @KITTY_COLUMN(columnOrder = 0) 17 @PRIMARY_KEY 18 @NOT_NULL 19 public Long id; 20 21 @KITTY_COLUMN(columnOrder = 1) 22 @NOT_NULL 23 @UNIQUE 24 public Long rndId; 25 26 @KITTY_COLUMN(columnOrder = 2) 27 @CHECK(checkExpression = "animal IN (\"CAT\", \"TIGER\", \"LION\")") // only cats allowed to this party 28 public Animals animal; 29 30 @KITTY_COLUMN(columnOrder = 3) 31 @DEFAULT(signedInteger = 28) // You can choose for options for default declaration, if nothing set than 0 value would be used 32 @NOT_NULL 33 public Integer defaultNumber; 34 35 @KITTY_COLUMN(columnOrder = 4) 36 @DEFAULT( 37 predefinedLiteralValue = LiteralValues.CURRENT_DATE 38 ) 39 @NOT_NULL 40 public String creationDate; 41 42 @KITTY_COLUMN(columnOrder = 5) 43 @DEFAULT( 44 predefinedLiteralValue = LiteralValues.CURRENT_TIMESTAMP 45 ) 46 @ONE_COLUMN_INDEX(unique = true, indexName = "IAC_unique_index_creation_timestamp") 47 @NOT_NULL 48 public Timestamp creationTmstmp; 49 50 @Override 51 public String toString() { 52 StringBuilder sb = new StringBuilder(64); 53 sb.append("[ RowID = ").append(getRowID()) 54 .append(" ; id = ").append(id) 55 .append(" ; rndId = ").append(rndId) 56 .append(" ; animal = ").append(animal) 57 .append(" ; defaultNumber = ").append(defaultNumber) 58 .append(" ; creationDate = ").append(creationDate) 59 .append(" ; creationTmstmp = ").append(creationTmstmp).append(" ]"); 60 return sb.toString(); 61 } 62}
Fragment and utility code used in this tutorial
Click to view
RNDRandomModelFactory.class
:1public class RNDRandomModelFactory { 2 3 private final Context context; 4 private final Random randomizer; 5 6 private final SparseArray<String> randomAnimalSays = new SparseArray<>(); 7 private final SparseArray<String> randomAnimalLocalizedName = new SparseArray<>(); 8 9 public RNDRandomModelFactory(Context context) { 10 super(); 11 this.context = context; 12 this.randomizer = new Random(); 13 14 // Lol, getContext().getString() method is slow, calling for each new random model this method twice causes 55% of all execution time of generating new random model (!) 15 // Right now getting those string causes only 14% of execution time 16 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.BEAR), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.BEAR))); 17 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.CAT), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.CAT))); 18 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.DOG), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.DOG))); 19 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.GOAT), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.GOAT))); 20 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.LION), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.LION))); 21 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.SHEEP), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.SHEEP))); 22 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.TIGER), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.TIGER))); 23 randomAnimalSays.append(Animals.getLocalizedAnimalSaysResource(Animals.WOLF), context.getString(Animals.getLocalizedAnimalSaysResource(Animals.WOLF))); 24 25 26 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.BEAR), context.getString(Animals.getLocalizedAnimalNameResource(Animals.BEAR))); 27 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.CAT), context.getString(Animals.getLocalizedAnimalNameResource(Animals.CAT))); 28 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.DOG), context.getString(Animals.getLocalizedAnimalNameResource(Animals.DOG))); 29 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.GOAT), context.getString(Animals.getLocalizedAnimalNameResource(Animals.GOAT))); 30 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.LION), context.getString(Animals.getLocalizedAnimalNameResource(Animals.LION))); 31 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.SHEEP), context.getString(Animals.getLocalizedAnimalNameResource(Animals.SHEEP))); 32 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.TIGER), context.getString(Animals.getLocalizedAnimalNameResource(Animals.TIGER))); 33 randomAnimalLocalizedName.append(Animals.getLocalizedAnimalNameResource(Animals.WOLF), context.getString(Animals.getLocalizedAnimalNameResource(Animals.WOLF))); 34 35 } 36 37 public RandomModel newRandomModel() { 38 RandomModel out = new RandomModel(); 39 out.randomInt = randomizer.nextInt(); 40 out.randomInteger = randomizer.nextInt(); 41 out.randomAnimal = Animals.rndAnimal(randomizer); 42 out.randomAnimalSays = randomAnimalSays.get(Animals.getLocalizedAnimalSaysResource(out.randomAnimal)); 43 out.randomAnimalName = randomAnimalLocalizedName.get(Animals.getLocalizedAnimalNameResource(out.randomAnimal)); 44 return out; 45 } 46}
Click to view
Lesson2Tab2Update.class
:1public class Lesson2Tab2Update extends Lesson2BaseFragment { 2 3 public Lesson2Tab2Update(){} 4 5 Button loadModelButton; 6 Button updateButton; 7 8 EditText loadModelIdET; 9 10 EditText randomIntET; 11 EditText randomIntegerET; 12 EditText randomAnimalNameET; 13 EditText randomAnimalSaysET; 14 15 TextView loadedModelTW; 16 17 18 @Override 19 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 20 View rootView = inflater.inflate(R.layout.lesson2_tab2_update, container, false); 21 setAnimalSpinner(rootView, R.id.l2_t2_spinner, new AdapterView.OnItemSelectedListener() { 22 @Override 23 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 24 String enumStringName = (String) animalSpinner.getAdapter().getItem(position); 25 if(enumStringName.equals(animalAdapter.getItem(animalAdapter.getCount()))) { 26 // do nothing, skip spinner hint 27 } else { 28 Animals animal = Animals.valueOf(enumStringName); 29 randomAnimalNameET.setText(Animals.getLocalizedAnimalNameResource(animal)); 30 randomAnimalSaysET.setText(Animals.getLocalizedAnimalSaysResource(animal)); 31 } 32 } 33 34 @Override 35 public void onNothingSelected(AdapterView<?> parent) { 36 37 } 38 }); 39 40 loadedModelTW = rootView.findViewById(R.id.l2_t2_tw_current_model); 41 loadModelButton = rootView.findViewById(R.id.l2_t2_load_button); 42 43 loadModelButton.setOnClickListener(new View.OnClickListener() { 44 @Override 45 public void onClick(View v) { 46 loadModel(); 47 } 48 }); 49 50 updateButton = rootView.findViewById(R.id.l2_t2_update_model_button); 51 52 updateButton.setOnClickListener(new View.OnClickListener() { 53 54 /** 55 * Called when a view has been clicked. 56 * 57 * @param v The view that was clicked. 58 */ 59 @Override 60 public void onClick(View v) { 61 updateModel(); 62 } 63 }); 64 65 randomIntET = rootView.findViewById(R.id.l2_t2_et_random_int); 66 randomIntegerET = rootView.findViewById(R.id.l2_t2_et_random_integer); 67 68 randomAnimalNameET = rootView.findViewById(R.id.l2_t2_et_animal_localised_name); 69 randomAnimalSaysET = rootView.findViewById(R.id.l2_t2_et_animal_says); 70 71 loadModelIdET = rootView.findViewById(R.id.l2_t2_et_id); 72 73 setUpExpandedList( 74 rootView, 75 R.id._l2_t2_expanded_panel_lw, 76 R.id._l2_t2_expanded_panel_text, 77 R.string._l2_t2_expanded_text_pattern 78 ); 79 80 return rootView; 81 } 82 83 void updateModel() { 84 String randomInt = randomIntET.getText().toString(); 85 String randomInteger = randomIntegerET.getText().toString(); 86 String animalEnumStringValue = animalSpinner.getSelectedItem().toString(); 87 88 if(animalEnumStringValue.equals(animalAdapter.getItem(animalAdapter.getCount()))) { 89 getLessonActivity().showWarningDialog(R.string._warning_dialog_title, R.string._l2_t1_warning_text, R.string._warning_dialog_ok_button_text); 90 return; 91 } 92 if(randomInt == null || randomInteger == null) { 93 getLessonActivity().showWarningDialog(R.string._warning_dialog_title, R.string._l2_t1_warning_text, R.string._warning_dialog_ok_button_text); 94 return; 95 } 96 if(randomInt.length() == 0 || randomInteger.length() == 0) { 97 getLessonActivity().showWarningDialog(R.string._warning_dialog_title, R.string._l2_t1_warning_text, R.string._warning_dialog_ok_button_text); 98 return; 99 } 100 int rndInt = 0; Integer rndInteger = null; 101 try { 102 rndInt = Integer.parseInt(randomInt); 103 rndInteger = Integer.valueOf(randomInteger); 104 } catch (Exception e) { 105 getLessonActivity().showWarningDialog(R.string._warning_dialog_title, R.string._l2_t1_warning_bad_input, R.string._warning_dialog_ok_button_text); 106 return; 107 } 108 if(isLoadedModelExists()) { 109 RandomMapper mapper = getMapper(); 110 RandomModel toUpdate = mapper.findByIPK(getLoadedModelId()); 111 RandomModel originalModel = toUpdate.clone(RandomModel.class); 112 toUpdate.randomInt = rndInt; 113 toUpdate.randomInteger = rndInteger; 114 Animals animal = Animals.valueOf(animalEnumStringValue); 115 toUpdate.randomAnimal = animal; 116 toUpdate.randomAnimalName = getString(Animals.getLocalizedAnimalNameResource(animal)); 117 toUpdate.randomAnimalSays = getString(Animals.getLocalizedAnimalSaysResource(animal)); 118 long updateStatus = mapper.update(toUpdate); 119 if(updateStatus > 0) { 120 addNewEventToExpandedPanel(format(getString(R.string._l2_t2_expanded_added), toUpdate.getRowID(), originalModel, toUpdate, mapper.countAll())); 121 } else { 122 addNewEventToExpandedPanel(format(getString(R.string._l2_t2_expanded_error), toUpdate)); 123 } 124 mapper.close(); 125 if(isLoadedModelExists()) { 126 modelExists(); 127 } else { 128 noModel(); 129 } 130 } else { 131 addNewEventToExpandedPanel(format(getString(R.string._l2_t2_expanded_error_unable), getLoadedModelId())); 132 } 133 } 134 135 void loadModel() { 136 String modelIdFromLoadET = loadModelIdET.getText().toString(); 137 if(modelIdFromLoadET == null) { 138 getLessonActivity().showWarningDialog( 139 R.string._warning_dialog_title, 140 R.string._l2_t2_warning_bad_id_input, 141 R.string._warning_dialog_ok_button_text); 142 return; 143 } 144 if(modelIdFromLoadET.length() == 0) { 145 getLessonActivity().showWarningDialog( 146 R.string._warning_dialog_title, 147 R.string._l2_t2_warning_bad_id_input, 148 R.string._warning_dialog_ok_button_text); 149 return; 150 } 151 Long modelToLoad = null; 152 try { 153 modelToLoad = Long.valueOf(modelIdFromLoadET); 154 } catch (Exception e) { 155 getLessonActivity().showWarningDialog( 156 R.string._warning_dialog_title, 157 R.string._l2_t2_warning_bad_id_input, 158 R.string._warning_dialog_ok_button_text); 159 return; 160 } 161 setLoadedModelId(modelToLoad); 162 if(isLoadedModelExists()) 163 modelExists(); 164 else { 165 getLessonActivity().showWarningDialog( 166 R.string._warning_dialog_title, 167 R.string._l2_t2_warning_no_record_with_id, 168 R.string._warning_dialog_ok_button_text); 169 noModel(); 170 } 171 } 172 173 @Override 174 public void onVisible() { 175 new LoadSelectedModel().execute(0l); 176 } 177 178 void modelExists() { 179 setUpdateFieldsActive(true); 180 loadModelData(getLoadedModelId()); 181 } 182 183 void noModel() { 184 setUpdateFieldsActive(false); 185 setLoadedModelTWText(null); 186 } 187 188 void loadModelData(Long IPK) { 189 RandomMapper mapper = getMapper(); 190 RandomModel model = mapper.findByIPK(IPK); 191 if(model == null) { 192 setUpdateFieldsActive(false); 193 } else { 194 loadModelValues(model); 195 } 196 setLoadedModelTWText(model); 197 } 198 199 void setLoadedModelTWText(RandomModel model) { 200 if(model == null) { 201 loadedModelTW.setText( 202 format( 203 getString(R.string._l2_t2_current_model_pattern), 204 getString(R.string._l2_t2_current_model_not_set) 205 ) 206 ); 207 } else { 208 loadedModelTW.setText( 209 format( 210 getString(R.string._l2_t2_current_model_pattern), 211 model 212 ) 213 ); 214 } 215 } 216 217 void loadModelValues(RandomModel model) { 218 loadModelIdET.setText(Long.toString(model.id)); 219 randomIntET.setText(Integer.toString(model.randomInt)); 220 randomIntegerET.setText(Integer.toString(model.randomInteger)); 221 randomAnimalSaysET.setText(model.randomAnimalSays); 222 randomAnimalNameET.setText(model.randomAnimalName); 223 animalSpinner.setSelection(animalAdapter.getPosition(model.randomAnimal.name()), true); 224 } 225 226 void setUpdateFieldsActive(boolean isActive) { 227 //randomIntET.setFocusable(isActive); 228 randomIntET.setEnabled(isActive); 229 230 //randomIntegerET.setFocusable(isActive); 231 randomIntegerET.setEnabled(isActive); 232 233 //updateButton.setFocusable(isActive); 234 updateButton.setEnabled(isActive); 235 236 //animalSpinner.setFocusable(isActive); 237 animalSpinner.setEnabled(isActive); 238 if(!isActive) 239 animalSpinner.setVisibility(View.GONE); 240 else 241 animalSpinner.setVisibility(View.VISIBLE); 242 243 randomAnimalSaysET.setEnabled(isActive); 244 randomAnimalNameET.setEnabled(isActive); 245 } 246 247 // Fab menu section 248 249 // Fab menu section 250 251 @Override 252 public View.OnClickListener helpFabMenuAction() { 253 return new View.OnClickListener() { 254 @Override 255 public void onClick(View v) { 256 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T2_TUTORIAL); 257 } 258 }; 259 } 260 261 @Override 262 public View.OnClickListener sourceFabMenuAction() { 263 return new View.OnClickListener() { 264 @Override 265 public void onClick(View v) { 266 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T2_SOURCE); 267 } 268 }; 269 } 270 271 @Override 272 public View.OnClickListener schemaFabMenuAction() { 273 return new View.OnClickListener() { 274 @Override 275 public void onClick(View v) { 276 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T2_SCHEMA); 277 } 278 }; 279 } 280 281 @Override 282 protected int snackbarMessageResource() { 283 return R.string._l2_t2_snackbar_message; 284 } 285 286 // Assyncs 287 private static String LOG_E_EXCEPTION_ON_LOAD = "Error on loading initial model at Lesson2Tab2Update, see exception details: "; 288 private static String LOG_E_EXCEPTION_ON_LOAD_NESTED = "Error on loading initial model at Lesson2Tab2Update, see exception details (nested exception): "; 289 290 class LoadSelectedModel extends AsyncTask<Long, Long, RandomModel> { 291 ProgressDialog dialog; 292 293 @Override 294 protected void onPreExecute() {} 295 296 @Override 297 protected RandomModel doInBackground(Long... params) { 298 Long modelToLoad = getLoadedModelId(); 299 if(modelToLoad == null) return null; 300 else { 301 try { 302 RandomMapper mapper = (RandomMapper) getDb().getMapper(RandomModel.class); 303 return mapper.findByIPK(modelToLoad); 304 } catch (Exception e) { 305 Log.e(BasicDatabase.LOG_TAG, LOG_E_EXCEPTION_ON_LOAD, e); 306 if(e instanceof KittyRuntimeException) { 307 if(((KittyRuntimeException) e).getNestedException() != null) 308 Log.e(BasicDatabase.LOG_TAG, 309 LOG_E_EXCEPTION_ON_LOAD_NESTED, 310 ((KittyRuntimeException) e).getNestedException()); 311 } 312 return null; 313 } 314 } 315 } 316 317 @Override 318 protected void onPostExecute(RandomModel result) { 319 if (result != null) { 320 loadModelValues(result); 321 setLoadedModelTWText(result); 322 } else { 323 setUpdateFieldsActive(false); 324 setLoadedModelTWText(null); 325 } 326 } 327 } 328}