Source code
KittyORM delete 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 toDelete = mapper.findByIPK(0l); 7// Deleting model 8long rowsAffected = mapper.delete(toDelete);
1// Deleting by random_int range 2BasicDatabase db = new BasicDatabase(getContext()); 3// Getting mapper instance 4RandomMapper mapper = (RandomMapper) db.getMapper(RandomModel.class); 5// Creating clause for deletion 6SQLiteCondition condition = new SQLiteConditionBuilder() 7 .addField("random_int") 8 .addSQLOperator(GREATER_OR_EQUAL) 9 .addValue(0) 10 .addSQLOperator(AND) 11 .addField("random_int") 12// Just as tip, you can pass SQLite operator as string, not only as 13// SQLiteOperator enum element 14 .addSQLOperator("<=") 15 .addValue(10000) 16 .build(); 17// Deleting with generated clause 18mapper.deleteWhere(condition); 19 20// Also, you may use pass condition as SQLite string 21mapper.deleteWhere("random_int >= ? AND random_int <= ?", 0, 10000) 22 23// And, finally, in those string you may use POJO field names in #?fieldName 24mapper.deleteWhere("#?randomInt >= ? AND #?randomInt <= ?", 0, 10000)
KittyORM SQLiteConditionBuilder
example
1SQLiteCondition condition = new SQLiteConditionBuilder()
2 .addColumn("a_column")
3 .addSQLOperator(EQUAL)
4 .addValue("a")
5 .addSQLOperator(AND)
6 .addSQLOperator(OPEN_SUBC)
7 .addColumn("b_column")
8 .addSQLOperator(GREATER_THAN)
9 .addValue(0)
10 .addSQLOperator(OR)
11 .addSQLOperator(BETWEEN)
12 .addValue(10)
13 .addSQLOperator(AND)
14 .addValue(20)
15 .addSQLOperator(CLOSE_SUBC)
16 .build();
17
18// Note that following condition is equal to previous one
19SQLiteCondition condition2 = new SQLiteConditionBuilder()
20 .addColumn("a_column")
21 .addSQLOperator("=")
22 .addValue("a")
23 .addSQLOperator("AND")
24 .addSQLOperator("(")
25 .addColumn("b_column")
26 .addSQLOperator(">=")
27 .addValue(0)
28 .addSQLOperator("OR")
29 .addSQLOperator("BETWEEN")
30 .addValue(10)
31 .addSQLOperator("AND")
32 .addValue(20)
33 .addSQLOperator(")")
34 .build();
35
36// And, finally, you can pass to condition builder not only column names but POJO field names as well
37SQLiteCondition condition3 = new SQLiteConditionBuilder()
38 .addField("aColumn", SomeModel.class)
39 .addSQLOperator("=")
40 .addValue("a")
41 .addSQLOperator("AND")
42 .addSQLOperator("(")
43 .addField("bColumn", SomeModel.class)
44 .addSQLOperator(">=")
45 .addValue(0)
46 .addSQLOperator("OR")
47 .addSQLOperator("BETWEEN")
48 .addValue(10)
49 .addSQLOperator("AND")
50 .addValue(20)
51 .addSQLOperator(")")
52 .build();
53
54// Also, if you would like use SQLite string to build condition, you may use following method:
55SQLiteCondition condition4 = SQLiteConditionBuilder.fromSQL("WHERE a_column = ? AND (b_column > ? OR BETWEEN ? AND ?)", SomeModel.class, "a", 0, 10, 20);
56
57// And, for SQLite string, you may pass POJO field names as well using #?fieldName syntax
58SQLiteCondition condition5 = SQLiteConditionBuilder.fromSQL("WHERE #?aColumn = ? AND (#?bColumn > ? OR BETWEEN ? AND ?)", SomeModel.class, "a", 0, 10, 20);
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
Lesson2Tab3Delete.class
:1package net.akaish.kittyormdemo.lessons.two; 2 3import android.app.ProgressDialog; 4import android.os.AsyncTask; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.AdapterView; 11import android.widget.Button; 12import android.widget.EditText; 13import android.widget.Toast; 14 15import net.akaish.kitty.orm.exceptions.KittyRuntimeException; 16import net.akaish.kittyormdemo.KittyTutorialActivity; 17import net.akaish.kittyormdemo.R; 18import net.akaish.kittyormdemo.lessons.LessonsUriConstants; 19import net.akaish.kittyormdemo.sqlite.basicdb.BasicDatabase; 20import net.akaish.kittyormdemo.sqlite.basicdb.RandomMapper; 21import net.akaish.kittyormdemo.sqlite.misc.Animals; 22 23import static java.text.MessageFormat.format; 24import static net.akaish.kittyormdemo.sqlite.basicdb.BasicDatabase.LOG_TAG; 25 26/** 27 * Created by akaish on 03.08.18. 28 * @author akaish (Denis Bogomolov) 29 */ 30 31public class Lesson2Tab3Delete extends Lesson2BaseFragment { 32 33 public Lesson2Tab3Delete(){}; 34 35 EditText deleteByIdEt; 36 Button deleteByIdButton; 37 38 EditText deleteByRangeStartET; 39 EditText deleteByRangeEndET; 40 Button deleteByRangeButton; 41 42 Button deleteByAnimalButton; 43 44 Button wipeDataButton; 45 46 47 @Override 48 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 49 View rootView = inflater.inflate(R.layout.lesson2_tab3_delete, container, false); 50 51 setAnimalSpinner(rootView, R.id.l2_t3_spinner, new AdapterView.OnItemSelectedListener() { 52 @Override 53 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 54 // do nothing 55 } 56 57 @Override 58 public void onNothingSelected(AdapterView<?> parent) { 59 // do nothing 60 } 61 }); 62 63 deleteByIdEt = rootView.findViewById(R.id.l2_t3_et_id); 64 deleteByIdButton = rootView.findViewById(R.id.l2_t3_delete_by_id_button); 65 66 deleteByRangeStartET = rootView.findViewById(R.id.l2_t3_et_id_range_start); 67 deleteByRangeEndET = rootView.findViewById(R.id.l2_t3_et_id_range_end); 68 deleteByRangeButton = rootView.findViewById(R.id.l2_t3_delete_by_range_button); 69 70 deleteByAnimalButton = rootView.findViewById(R.id.l2_t3_delete_by_animal_button); 71 72 deleteByIdButton.setOnClickListener(new View.OnClickListener() { 73 @Override 74 public void onClick(View v) { 75 deleteById(); 76 } 77 }); 78 79 deleteByRangeButton.setOnClickListener(new View.OnClickListener() { 80 @Override 81 public void onClick(View v) { 82 deleteByRange(); 83 } 84 }); 85 86 deleteByAnimalButton.setOnClickListener(new View.OnClickListener() { 87 @Override 88 public void onClick(View v) { 89 deleteByAnimal(); 90 } 91 }); 92 93 wipeDataButton = rootView.findViewById(R.id.l2_t3_wipe); 94 wipeDataButton.setOnClickListener(new View.OnClickListener() { 95 @Override 96 public void onClick(View v) { 97 wipeData(); 98 } 99 }); 100 101 setUpExpandedList( 102 rootView, 103 R.id._l2_t3_expanded_panel_lw, 104 R.id._l2_t3_expanded_panel_text, 105 R.string._l2_t3_expanded_text_pattern 106 ); 107 108 return rootView; 109 } 110 111 void wipeData() { 112 RandomMapper mapper = getMapper(); 113 countRecordsToExpandedPanel(mapper); 114 115 DeleteAsync task = new DeleteAsync(new DeleteTask(DELETE_ALL, mapper, null, null, null) { 116 117 @Override 118 void publishResultToEventList(Long resultDelete) { 119 String result = null; 120 StringBuilder operation = new StringBuilder(16).append("\'wipe all\'"); 121 if(resultDelete > -1) { 122 result = format(getString(R.string._l2_t3_delete_model_completed), resultDelete, operation); 123 } else { 124 result = format(getString(R.string._l2_t3_delete_model_error), LOG_TAG, operation); 125 } 126 addNewEventToExpandedPanel(result); 127 countRecordsToExpandedPanel(deleteMapper); 128 deleteMapper.close(); 129 } 130 }); 131 132 task.execute(""); 133 } 134 135 void deleteById() { 136 RandomMapper mapper = getMapper(); 137 countRecordsToExpandedPanel(mapper); 138 String inputId = deleteByIdEt.getText().toString(); 139 if(inputId == null) { 140 getLessonActivity().showWarningDialog( 141 R.string._warning_dialog_title, 142 R.string._l2_t3_delete_by_id_message, 143 R.string._warning_dialog_ok_button_text 144 ); 145 mapper.close(); 146 return; 147 } 148 if(inputId.length() == 0) { 149 getLessonActivity().showWarningDialog( 150 R.string._warning_dialog_title, 151 R.string._l2_t3_delete_by_id_message, 152 R.string._warning_dialog_ok_button_text 153 ); 154 mapper.close(); 155 return; 156 } 157 Long idToDelete = null; 158 try { 159 idToDelete = Long.valueOf(inputId); 160 } catch (Exception e) { 161 getLessonActivity().showWarningDialog( 162 R.string._warning_dialog_title, 163 R.string._l2_t3_delete_by_id_message, 164 R.string._warning_dialog_ok_button_text 165 ); 166 mapper.close(); 167 return; 168 } 169 long affectedRecords = mapper.deleteByIPK(idToDelete); 170 String result = null; 171 StringBuilder operation = new StringBuilder(16).append("id = ").append(idToDelete); 172 if(affectedRecords > -1) { 173 result = format(getString(R.string._l2_t3_delete_model_completed), affectedRecords, operation); 174 } else { 175 result = format(getString(R.string._l2_t3_delete_model_error), LOG_TAG, operation); 176 } 177 addNewEventToExpandedPanel(result); 178 countRecordsToExpandedPanel(mapper); 179 mapper.close(); 180 } 181 182 void deleteByRange() { 183 RandomMapper mapper = getMapper(); 184 countRecordsToExpandedPanel(mapper); 185 String rangeStart = deleteByRangeStartET.getText().toString(); 186 String rangeEnd = deleteByRangeEndET.getText().toString(); 187 if(rangeStart == null || rangeEnd == null) { 188 getLessonActivity().showWarningDialog( 189 R.string._warning_dialog_title, 190 R.string._l2_t3_delete_by_range_message, 191 R.string._warning_dialog_ok_button_text 192 ); 193 mapper.close(); 194 return; 195 } 196 if(rangeStart.length() == 0 || rangeEnd.length() == 0) { 197 getLessonActivity().showWarningDialog( 198 R.string._warning_dialog_title, 199 R.string._l2_t3_delete_by_range_message, 200 R.string._warning_dialog_ok_button_text 201 ); 202 mapper.close(); 203 return; 204 } 205 int rangeStartInt = 0; int rangeEndInt = 0; 206 try { 207 rangeStartInt = Integer.parseInt(rangeStart); 208 rangeEndInt = Integer.parseInt(rangeEnd); 209 } catch (Exception e) { 210 getLessonActivity().showWarningDialog( 211 R.string._warning_dialog_title, 212 R.string._l2_t3_delete_by_range_message, 213 R.string._warning_dialog_ok_button_text 214 ); 215 mapper.close(); 216 return; 217 } 218 219 DeleteAsync task = new DeleteAsync(new DeleteTask(DELETE_BY_RANGE, mapper, null, rangeStartInt, rangeEndInt) { 220 221 @Override 222 void publishResultToEventList(Long resultDelete) { 223 String result = null; 224 StringBuilder operation = new StringBuilder(32).append("randomInt range [") 225 .append(deleteRangeStart) 226 .append("; ") 227 .append(deleteRangeEnd) 228 .append("]"); 229 if(resultDelete > -1) { 230 result = format(getString(R.string._l2_t3_delete_model_completed), resultDelete, operation); 231 } else { 232 result = format(getString(R.string._l2_t3_delete_model_error), LOG_TAG, operation); 233 } 234 addNewEventToExpandedPanel(result); 235 countRecordsToExpandedPanel(deleteMapper); 236 deleteMapper.close(); 237 } 238 }); 239 240 task.execute(""); 241 } 242 243 void deleteByAnimal() { 244 RandomMapper mapper = getMapper(); 245 countRecordsToExpandedPanel(mapper); 246 String animalStr = (String) animalSpinner.getSelectedItem(); 247 if(animalStr.equals(animalAdapter.getItem(animalAdapter.getCount()))) { 248 getLessonActivity().showWarningDialog( 249 R.string._warning_dialog_title, 250 R.string._l2_t3_delete_by_animal_message, 251 R.string._warning_dialog_ok_button_text 252 ); 253 mapper.close(); 254 return; 255 } 256 Animals animal = Animals.valueOf(animalStr); 257 258 DeleteAsync task = new DeleteAsync(new DeleteTask(DELETE_BY_ANIMAL, mapper, animal, null, null) { 259 260 @Override 261 void publishResultToEventList(Long resultDelete) { 262 String result = null; 263 StringBuilder operation = new StringBuilder(16).append("deleteAnimal = ").append(deleteAnimal.name()); 264 if(resultDelete > -1) { 265 result = format(getString(R.string._l2_t3_delete_model_completed), resultDelete, operation); 266 } else { 267 result = format(getString(R.string._l2_t3_delete_model_error), LOG_TAG, operation); 268 } 269 addNewEventToExpandedPanel(result); 270 countRecordsToExpandedPanel(deleteMapper); 271 deleteMapper.close(); 272 } 273 }); 274 275 task.execute(""); 276 277 } 278 279 void countRecordsToExpandedPanel(RandomMapper mapper) { 280 addNewEventToExpandedPanel(format(getString(R.string._l2_t3_delete_model_count_completed), mapper.countAll())); 281 } 282 283 private static final int DELETE_BY_RANGE = 1; 284 private static final int DELETE_BY_ANIMAL = 2; 285 private static final int DELETE_ALL = 3; 286 287 abstract class DeleteTask { 288 289 private int operation; 290 RandomMapper deleteMapper; 291 Animals deleteAnimal; 292 Integer deleteRangeStart; 293 Integer deleteRangeEnd; 294 295 public DeleteTask(int operation, RandomMapper mapper, Animals animal, Integer rangeStart, Integer rangeEnd) { 296 this.operation = operation; 297 this.deleteMapper = mapper; 298 this.deleteAnimal = animal; 299 this.deleteRangeStart = rangeStart; 300 this.deleteRangeEnd = rangeEnd; 301 } 302 303 Long deleteInBackground() { 304 switch (operation) { 305 case DELETE_BY_RANGE: 306 return deleteMapper.deleteByRandomIntegerRange(deleteRangeStart, deleteRangeEnd); 307 case DELETE_BY_ANIMAL: 308 return deleteMapper.deleteByAnimal(deleteAnimal); 309 case DELETE_ALL: 310 return deleteMapper.deleteAll(); 311 } 312 return -1l; 313 } 314 315 abstract void publishResultToEventList(Long resultDelete); 316 } 317 318 class DeleteAsync extends AsyncTask<String, String, Long> { 319 private DeleteTask deleteTask; 320 321 ProgressDialog dialog; 322 323 DeleteAsync(DeleteTask task) { 324 deleteTask = task; 325 } 326 327 @Override 328 protected void onPreExecute() { 329 dialog = ProgressDialog.show( 330 Lesson2Tab3Delete.this.getLessonActivity(), 331 Lesson2Tab3Delete.this.getString(R.string._l2_t3_delete_dialog_title), 332 Lesson2Tab3Delete.this.getString(R.string._l2_t3_delete_message) 333 ); 334 dialog.setCancelable(false); 335 } 336 337 /** 338 * Override this method to perform a computation on a background thread. The 339 * specified parameters are the parameters passed to {@link #execute} 340 * by the caller of this task. 341 * <p> 342 * This method can call {@link #publishProgress} to publish updates 343 * on the UI thread. 344 * 345 * @param strings The parameters of the task. 346 * @return A result, defined by the subclass of this task. 347 * @see #onPreExecute() 348 * @see #onPostExecute 349 * @see #publishProgress 350 */ 351 @Override 352 protected Long doInBackground(String... strings) { 353 try { 354 return deleteTask.deleteInBackground(); 355 } catch (Exception e) { 356 Log.e(BasicDatabase.LOG_TAG, "Exception caught on delete, see details", e); 357 if(e instanceof KittyRuntimeException) 358 if(((KittyRuntimeException) e).getNestedException() != null) 359 Log.e(BasicDatabase.LOG_TAG, "Nested exception: ", ((KittyRuntimeException) e).getNestedException()); 360 } 361 return -1l; 362 } 363 364 @Override 365 protected void onPostExecute(Long result) { 366 deleteTask.publishResultToEventList(result); 367 dialog.cancel(); 368 } 369 370 371 } 372 373 // Fab menu section 374 375 // Fab menu section 376 377 @Override 378 public View.OnClickListener helpFabMenuAction() { 379 return new View.OnClickListener() { 380 @Override 381 public void onClick(View v) { 382 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T3_TUTORIAL); 383 } 384 }; 385 } 386 387 @Override 388 public View.OnClickListener sourceFabMenuAction() { 389 return new View.OnClickListener() { 390 @Override 391 public void onClick(View v) { 392 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T3_SOURCE); 393 } 394 }; 395 } 396 397 @Override 398 public View.OnClickListener schemaFabMenuAction() { 399 return new View.OnClickListener() { 400 @Override 401 public void onClick(View v) { 402 ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T3_SCHEMA); 403 } 404 }; 405 } 406 407 @Override 408 protected int snackbarMessageResource() { 409 return R.string._l2_t3_snackbar_message; 410 } 411}