1// Initializing database instance
 2BasicDatabase db = new BasicDatabase(getContext());
 3// Getting mapper instance
 4RandomMapper mapper = (RandomMapper) db.getMapper(RandomModel.class);
 5// Generating list of entities to insert
 6List<RandomModel> toSave = new ArrayList<>();
 7// Filling this list with randomly generated POJOs
 8RNDRandomModelFactory rndFactory = new RNDRandomModelFactory(getContext());
 9for(int i = 0; i < 100; i++) {
10    toSave.add(rndFactory.newRandomModel());
11}
12// Running bulk save
13mapper.save(toSave);
 
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}
 
 
 
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 Lesson2Tab5Random.class: 
  1public class Lesson2Tab5Random extends Lesson2BaseFragment {
  2
  3    public Lesson2Tab5Random(){}
  4
  5    CheckBox newInstanceCheckbox;
  6    Button new10Button;
  7    Button new500Button;
  8    Button new500TXButton;
  9
 10    @Override
 11    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 12        View rootView = inflater.inflate(R.layout.lesson2_tab5_rnd, container, false);
 13        newInstanceCheckbox = rootView.findViewById(R.id.l2_t5_check_new_database_instance_for_operation);
 14        new10Button = rootView.findViewById(R.id.l2_t5_insert_10);
 15        new500Button = rootView.findViewById(R.id.l2_t5_insert_50k);
 16        new500TXButton = rootView.findViewById(R.id.l2_t5_insert_50k_tx);
 17        new10Button.setOnClickListener(new View.OnClickListener() {
 18            @Override
 19            public void onClick(View v) {
 20                //insert50RandomForProfiling();
 21                countRecordsToExpandedPanel(getMapper());
 22                InsertInAsync ten = new InsertInAsync(OPERATION_TEN_NEW, newInstanceCheckbox.isChecked());
 23                ten.execute("");
 24            }
 25        });
 26        new500Button.setOnClickListener(new View.OnClickListener() {
 27            @Override
 28            public void onClick(View v) {
 29                countRecordsToExpandedPanel(getMapper());
 30                InsertInAsync fh = new InsertInAsync(OPERATION_FIFTY_K_NEW, newInstanceCheckbox.isChecked());
 31                fh.execute("");
 32            }
 33        });
 34        new500TXButton.setOnClickListener(new View.OnClickListener() {
 35            @Override
 36            public void onClick(View v) {
 37                countRecordsToExpandedPanel(getMapper());
 38                InsertInAsync fhtx = new InsertInAsync(OPERATION_FIFTY_K_TX_NEW, newInstanceCheckbox.isChecked());
 39                fhtx.execute("");
 40            }
 41        });
 42        setUpExpandedList(
 43                rootView,
 44                R.id._l2_t5_expanded_panel_lw,
 45                R.id._l2_t5_expanded_panel_text,
 46                R.string._l2_t5_expanded_text_pattern
 47        );
 48        return rootView;
 49    }
 50
 51    void countRecordsToExpandedPanel(RandomMapper mapper) {
 52        addNewEventToExpandedPanel(format(getString(R.string._l2_t5_count_completed), mapper.countAll()));
 53    }
 54
 55    void insert50RandomForProfiling() {
 56        RandomMapper m = getMapper();
 57        List<RandomModel> genRnd = new LinkedList<>();
 58        RNDRandomModelFactory factory = new RNDRandomModelFactory(getContext());
 59        for(int i = 0; i<50; i++) {
 60            genRnd.add(factory.newRandomModel());
 61        }
 62        m.insertInTransaction(genRnd);
 63    }
 64
 65    // Fab menu section
 66
 67    @Override
 68    public View.OnClickListener helpFabMenuAction() {
 69        return new View.OnClickListener() {
 70            @Override
 71            public void onClick(View v) {
 72                ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T5_TUTORIAL);
 73            }
 74        };
 75    }
 76
 77    @Override
 78    public View.OnClickListener sourceFabMenuAction() {
 79        return new View.OnClickListener() {
 80            @Override
 81            public void onClick(View v) {
 82                ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T5_SOURCE);
 83            }
 84        };
 85    }
 86
 87    @Override
 88    public View.OnClickListener schemaFabMenuAction() {
 89        return new View.OnClickListener() {
 90            @Override
 91            public void onClick(View v) {
 92                ((KittyTutorialActivity)getActivity()).showWebViewDialog(LessonsUriConstants.L2_T5_SCHEMA);
 93            }
 94        };
 95    }
 96
 97    @Override
 98    protected int snackbarMessageResource() {
 99        return R.string._l2_t5_snackbar_message;
100    }
101
102    final static int OPERATION_TEN_NEW = 0;
103    final static int OPERATION_FIFTY_K_NEW = 1;
104    final static int OPERATION_FIFTY_K_TX_NEW = 2;
105
106    class InsertInAsync extends AsyncTask<String, String, Integer> {
107
108        // It is not profiling (!)
109        private long nanosStart;
110        private long nanosGetDatabaseAnaMapper;
111        private long nanosGenerateRandomModelsToInsert;
112        private long nanosInsert;
113
114        private final int operation;
115
116        private final boolean useNewDatabaseObject;
117
118        ProgressDialog dialog;
119
120        InsertInAsync(int operation, boolean useNewDatabaseObject) {
121            this.operation = operation;
122            this.useNewDatabaseObject = useNewDatabaseObject;
123        }
124
125        BasicDatabase getDatabase() {
126            if(useNewDatabaseObject)
127                return new BasicDatabase(Lesson2Tab5Random.this.getContext());
128            else
129                return Lesson2Tab5Random.this.getDb();
130        }
131
132        RandomMapper getRandomMapperForAssync() {
133            return (RandomMapper) getDatabase().getMapper(RandomModel.class);
134        }
135
136        void insertIntoDB() {
137            RNDRandomModelFactory rndFactory = new RNDRandomModelFactory(Lesson2Tab5Random.this.getContext());
138            nanosStart = System.nanoTime();
139            RandomMapper mapper = getRandomMapperForAssync();
140            nanosGetDatabaseAnaMapper = System.nanoTime();
141            List<RandomModel> toInsert = new ArrayList<>();
142            switch (operation) {
143                case OPERATION_TEN_NEW:
144                    for(int i = 0; i < 10; i++) {
145                        toInsert.add(rndFactory.newRandomModel());
146                    }
147                    break;
148                default:
149                    for(int i = 0; i < 50000; i++) {
150                        toInsert.add(rndFactory.newRandomModel());
151                    }
152            }
153            nanosGenerateRandomModelsToInsert = System.nanoTime();
154            switch (operation) {
155                case OPERATION_TEN_NEW:
156                    mapper.insert(toInsert);
157                    break;
158                case OPERATION_FIFTY_K_TX_NEW:
159                    mapper.insertInTransaction(toInsert);
160                    break;
161                case OPERATION_FIFTY_K_NEW:
162                    mapper.insert(toInsert);
163                    break;
164            }
165            nanosInsert = System.nanoTime();
166            mapper.close();
167        }
168
169        /**
170         * Override this method to perform a computation on a background thread. The
171         * specified parameters are the parameters passed to {@link #execute}
172         * by the caller of this task.
173         * <p>
174         * This method can call {@link #publishProgress} to publish updates
175         * on the UI thread.
176         *
177         * @param strings The parameters of the task.
178         * @return A result, defined by the subclass of this task.
179         * @see #onPreExecute()
180         * @see #onPostExecute
181         * @see #publishProgress
182         */
183        @Override
184        protected Integer doInBackground(String... strings) {
185            try {
186                insertIntoDB();
187            } catch (Exception e) {
188                Log.e(BasicDatabase.LOG_TAG, "Exception caught on insertion, see details", e);
189                if(e instanceof KittyRuntimeException)
190                    if(((KittyRuntimeException) e).getNestedException() != null)
191                        Log.e(BasicDatabase.LOG_TAG, "Nested exception: ", ((KittyRuntimeException) e).getNestedException());
192                return -1;
193            }
194            return 1;
195        }
196
197        @Override
198        protected void onPreExecute() {
199            int progressDialogStringId = 0;
200            switch (operation) {
201                case OPERATION_TEN_NEW:
202                    progressDialogStringId = R.string._l2_t5_inserting_10;
203                    break;
204                case OPERATION_FIFTY_K_NEW:
205                    progressDialogStringId = R.string._l2_t5_inserting_50k;
206                    break;
207                case OPERATION_FIFTY_K_TX_NEW:
208                    progressDialogStringId = R.string._l2_t5_inserting_50kTX;
209                    break;
210            }
211            dialog = ProgressDialog.show(
212                    Lesson2Tab5Random.this.getLessonActivity(),
213                    Lesson2Tab5Random.this.getString(R.string._l2_t5_inserting_dialog_title),
214                    Lesson2Tab5Random.this.getString(progressDialogStringId)
215            );
216            dialog.setCancelable(false);
217        }
218
219        @Override
220        protected void onPostExecute(Integer result) {
221            int operationNameStringId = 0;
222            switch (operation) {
223                case OPERATION_TEN_NEW:
224                    operationNameStringId = R.string._l2_t5_inserting_10_OP;
225                    break;
226                case OPERATION_FIFTY_K_NEW:
227                    operationNameStringId = R.string._l2_t5_inserting_50k_OP;
228                    break;
229                case OPERATION_FIFTY_K_TX_NEW:
230                    operationNameStringId = R.string._l2_t5_inserting_50kTX_OP;
231                    break;
232            }
233            if(result > 0) {
234
235                String successfullEvent = format(
236                        Lesson2Tab5Random.this.getString(R.string._l2_t5_inserted_event),
237                        Lesson2Tab5Random.this.getString(operationNameStringId),
238                        useNewDatabaseObject,
239                        nanosInsert - nanosStart,
240                        nanosGetDatabaseAnaMapper - nanosStart,
241                        nanosGenerateRandomModelsToInsert - nanosGetDatabaseAnaMapper,
242                        nanosInsert - nanosGenerateRandomModelsToInsert
243                );
244                Lesson2Tab5Random.this.addNewEventToExpandedPanel(successfullEvent);
245            } else {
246                String eventErrorMessage = format(
247                        Lesson2Tab5Random.this.getString(R.string._l2_t5_inserted_event_error),
248                        Lesson2Tab5Random.this.getString(operation),
249                        BasicDatabase.LOG_TAG
250                );
251                Lesson2Tab5Random.this.addNewEventToExpandedPanel(eventErrorMessage);
252            }
253            dialog.cancel();
254            countRecordsToExpandedPanel(getMapper());
255        }
256    }
257}