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}