Skip to content
This repository was archived by the owner on Feb 11, 2022. It is now read-only.

Commit b57d0d7

Browse files
author
Andrei Catinean
committed
Adds bulk insert example into the extended example app
1 parent 9e74226 commit b57d0d7

14 files changed

Lines changed: 313 additions & 22 deletions

demo-extended/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
<activity
2626
android:name=".ui.AddFireworkActivity"
2727
android:label="@string/activity_label_add_new_firework" />
28+
<activity
29+
android:name=".ui.AddBulkFireworksActivity"
30+
android:label="@string/activity_label_add_bulk_fireworks" />
2831
<activity
2932
android:name=".ui.FindFireworkWithPkActivity"
3033
android:label="@string/activity_label_find_firework" />

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/domain/UseCaseFactory.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,30 @@ private UseCaseFactory() {
1010
}
1111

1212
public enum UseCase {
13-
ADD, ONE_TO_MANY, PRIMARY_KEY_LOOKUP, SELECT_ALL, DISTINCT, LIMIT, GROUP_HAVING;
13+
ADD, BULK_ADD, ONE_TO_MANY, PRIMARY_KEY_LOOKUP, SELECT_ALL, DISTINCT, LIMIT, GROUP_HAVING;
1414
}
1515

1616
public static UseCaseInfo getInfo(UseCase useCase) {
1717
switch (useCase) {
18-
case ADD:
19-
return createUseCaseInfo(FireworkUriConstants.ADD_FIREWORK, RawSql.INSERT_FIREWORK);
20-
case ONE_TO_MANY:
21-
return createUseCaseInfo(FireworkUriConstants.ONE_TO_MANY_SEARCH, RawSql.SELECT_USING_SHOP_FOREIGN_KEY);
22-
case PRIMARY_KEY_LOOKUP:
23-
return createUseCaseInfo(FireworkUriConstants.PRIMARY_KEY_SEARCH, RawSql.SELECT_USING_PRIMARY_KEY);
24-
case SELECT_ALL:
25-
return createUseCaseInfo(FireworkUriConstants.VIEW_ALL_SEARCH, RawSql.SELECT_ALL);
26-
case DISTINCT:
27-
return createUseCaseInfo(FireworkUriConstants.UNIQUE_SEARCH, RawSql.DISTINCT);
28-
case LIMIT:
29-
return createUseCaseInfo(FireworkUriConstants.LIMIT_3, RawSql.LIMIT);
30-
case GROUP_HAVING:
31-
return createUseCaseInfo(FireworkUriConstants.GROUP_BY_SEARCH, RawSql.GROUP_BY);
32-
default:
33-
Log.e("UseCase " + useCase.toString() + " not found, returning null safe case.");
34-
return UseCaseInfo.getNullSafe();
18+
case ADD:
19+
return createUseCaseInfo(FireworkUriConstants.ADD_FIREWORK, RawSql.INSERT_FIREWORK);
20+
case BULK_ADD:
21+
return createUseCaseInfo(FireworkUriConstants.ADD_FIREWORK, RawSql.BULK_INSERT_FIREWORKS);
22+
case ONE_TO_MANY:
23+
return createUseCaseInfo(FireworkUriConstants.ONE_TO_MANY_SEARCH, RawSql.SELECT_USING_SHOP_FOREIGN_KEY);
24+
case PRIMARY_KEY_LOOKUP:
25+
return createUseCaseInfo(FireworkUriConstants.PRIMARY_KEY_SEARCH, RawSql.SELECT_USING_PRIMARY_KEY);
26+
case SELECT_ALL:
27+
return createUseCaseInfo(FireworkUriConstants.VIEW_ALL_SEARCH, RawSql.SELECT_ALL);
28+
case DISTINCT:
29+
return createUseCaseInfo(FireworkUriConstants.UNIQUE_SEARCH, RawSql.DISTINCT);
30+
case LIMIT:
31+
return createUseCaseInfo(FireworkUriConstants.LIMIT_3, RawSql.LIMIT);
32+
case GROUP_HAVING:
33+
return createUseCaseInfo(FireworkUriConstants.GROUP_BY_SEARCH, RawSql.GROUP_BY);
34+
default:
35+
Log.e("UseCase " + useCase.toString() + " not found, returning null safe case.");
36+
return UseCaseInfo.getNullSafe();
3537
}
3638
}
3739

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.novoda.sqliteprovider.demo.loader;
2+
3+
import android.content.Context;
4+
import android.support.v4.content.AsyncTaskLoader;
5+
6+
import com.novoda.sqliteprovider.demo.domain.Firework;
7+
import com.novoda.sqliteprovider.demo.persistance.FireworkWriter;
8+
9+
import java.util.List;
10+
11+
public class FireworksBulkSaver extends AsyncTaskLoader<List<Firework>> {
12+
13+
private final FireworkWriter writer;
14+
private final List<Firework> fireworks;
15+
public static final int LOADER_ID = 123;
16+
17+
public FireworksBulkSaver(Context context, FireworkWriter writer, List<Firework> fireworks) {
18+
super(context);
19+
this.writer = writer;
20+
this.fireworks = fireworks;
21+
forceLoad();
22+
}
23+
24+
@Override
25+
public List<Firework> loadInBackground() {
26+
writer.saveFireworks(fireworks);
27+
return fireworks;
28+
}
29+
30+
}

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/persistance/DatabaseConstants.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,10 @@ public static class RawSql {
3838
public static final String LIMIT = "SELECT * FROM firework LIMIT 3;";
3939

4040
public static final String DISTINCT = "SELECT DISTINCT name, ftype, color, noise, price FROM firework;";
41+
public static final String BULK_INSERT_FIREWORKS = "BEGIN TRANSACTION\n" +
42+
"FOR Times DO\n" +
43+
"INSERT INTO firework " + "(name, color, noise, ftype, price, " +
44+
"shop_id) VALUES (Na, Co, No, Ft, Pr, Sh);\n" +
45+
"END TRANSACTION";
4146
}
4247
}

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/persistance/DatabaseWriter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ public void saveDataToFireworksTable(ContentValues values) {
1818
saveDataToTable(DatabaseConstants.TBL_FIREWORKS, values);
1919
}
2020

21+
public void bulkSaveDataToFireworksTable(ContentValues[] values) {
22+
bulkSaveDataToTable(DatabaseConstants.TBL_FIREWORKS, values);
23+
}
24+
25+
private void bulkSaveDataToTable(String table, ContentValues[] values) {
26+
Uri uri = createUri(table);
27+
contentResolver.bulkInsert(uri, values);
28+
}
29+
2130
private void saveDataToTable(String table, ContentValues values) {
2231
Uri uri = createUri(table);
2332
contentResolver.insert(uri, values);

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/persistance/FireworkWriter.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
import com.novoda.sqliteprovider.demo.domain.Firework;
66

7+
import java.util.ArrayList;
8+
import java.util.List;
9+
710
import static com.novoda.sqliteprovider.demo.persistance.DatabaseConstants.Fireworks.*;
811

912
public class FireworkWriter {
@@ -15,15 +18,29 @@ public FireworkWriter(DatabaseWriter databaseWriter) {
1518
}
1619

1720
public void saveFirework(Firework firework) {
21+
ContentValues values = createContentValuesFrom(firework);
22+
databaseWriter.saveDataToFireworksTable(values);
23+
}
24+
25+
public void saveFireworks(List<Firework> fireworks) {
26+
List<ContentValues> valuesArray = new ArrayList<>();
27+
for (Firework firework : fireworks) {
28+
ContentValues values = createContentValuesFrom(firework);
29+
valuesArray.add(values);
30+
}
31+
32+
databaseWriter.bulkSaveDataToFireworksTable(valuesArray.toArray(new ContentValues[fireworks.size()]));
33+
}
34+
35+
private ContentValues createContentValuesFrom(Firework firework) {
1836
ContentValues values = new ContentValues();
1937
values.put(COL_NAME, firework.getName());
2038
values.put(COL_COLOR, firework.getColor());
2139
values.put(COL_NOISE, firework.getNoise());
2240
values.put(COL_TYPE, firework.getType());
2341
values.put(COL_PRICE, firework.getPrice());
2442
values.put(COL_SHOP, 1);
25-
26-
databaseWriter.saveDataToFireworksTable(values);
43+
return values;
2744
}
2845

2946
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.novoda.sqliteprovider.demo.ui;
2+
3+
import android.os.Bundle;
4+
import android.support.v4.app.LoaderManager.LoaderCallbacks;
5+
import android.support.v4.content.Loader;
6+
import android.text.TextUtils;
7+
import android.widget.Toast;
8+
9+
import com.novoda.sqliteprovider.demo.R;
10+
import com.novoda.sqliteprovider.demo.domain.Firework;
11+
import com.novoda.sqliteprovider.demo.domain.UseCaseFactory;
12+
import com.novoda.sqliteprovider.demo.loader.FireworkSaver;
13+
import com.novoda.sqliteprovider.demo.loader.FireworksBulkSaver;
14+
import com.novoda.sqliteprovider.demo.persistance.DatabaseConstants;
15+
import com.novoda.sqliteprovider.demo.ui.base.NovodaActivity;
16+
import com.novoda.sqliteprovider.demo.ui.fragment.AddBulkFireworksFragment.AddBulkFireworksListener;
17+
import com.novoda.sqliteprovider.demo.ui.fragment.UriSqlFragment;
18+
19+
import java.util.List;
20+
21+
public class AddBulkFireworksActivity extends NovodaActivity implements AddBulkFireworksListener, LoaderCallbacks<List<Firework>> {
22+
23+
private UriSqlFragment uriSqlFragment;
24+
private List<Firework> fireworks;
25+
26+
@Override
27+
public void onCreate(Bundle savedInstanceState) {
28+
super.onCreate(savedInstanceState);
29+
setContentView(R.layout.activity_add_bulk_fireworks);
30+
31+
uriSqlFragment = (UriSqlFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_uri_sql);
32+
uriSqlFragment.setInfo(UseCaseFactory.UseCase.BULK_ADD);
33+
}
34+
35+
@Override
36+
public void onEmptyInput() {
37+
Toast.makeText(this, "Fill in the number of fireworks to add", Toast.LENGTH_SHORT).show();
38+
}
39+
40+
@Override
41+
public void onBulkAddClick(List<Firework> fireworks) {
42+
this.fireworks = fireworks;
43+
getSupportLoaderManager().initLoader(FireworkSaver.LOADER_ID, null, this);
44+
}
45+
46+
@Override
47+
public Loader<List<Firework>> onCreateLoader(int id, Bundle args) {
48+
return new FireworksBulkSaver(this, getApp().getFireworkWriter(), fireworks);
49+
}
50+
51+
@Override
52+
public void onLoadFinished(Loader<List<Firework>> loader, List<Firework> data) {
53+
Toast.makeText(this, data.size() + " fireworks added!", Toast.LENGTH_LONG).show();
54+
uriSqlFragment.updateSql(createSQL(data));
55+
}
56+
57+
private String createSQL(List<Firework> data) {
58+
Firework firework = data.get(0);
59+
return TextUtils.replace(
60+
DatabaseConstants.RawSql.BULK_INSERT_FIREWORKS,
61+
new String[]{"Times", "Na", "Co", "No", "Ft", "Pr", "Sh"},
62+
new CharSequence[]{
63+
String.valueOf(data.size()),
64+
firework.getName(),
65+
firework.getColor(),
66+
firework.getNoise(),
67+
firework.getType(),
68+
String.valueOf(firework.getPrice()), "1"
69+
}).toString();
70+
}
71+
72+
@Override
73+
public void onLoaderReset(Loader<List<Firework>> loader) {
74+
}
75+
}

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/ui/MainActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ public void onAddFireworkClick(View button) {
3030
startActivity(AddFireworkActivity.class);
3131
}
3232

33+
@Override
34+
@FromXML
35+
public void onBulkAddFireworksClick(View view) {
36+
startActivity(AddBulkFireworksActivity.class);
37+
}
38+
3339
@Override
3440
@FromXML
3541
public void onFindFireworkWithPrimaryKeyClick(View button) {
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.novoda.sqliteprovider.demo.ui.fragment;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.support.v4.app.Fragment;
6+
import android.text.TextUtils;
7+
import android.view.LayoutInflater;
8+
import android.view.View;
9+
import android.view.ViewGroup;
10+
import android.widget.EditText;
11+
12+
import com.novoda.sqliteprovider.demo.R;
13+
import com.novoda.sqliteprovider.demo.domain.Firework;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class AddBulkFireworksFragment extends Fragment {
19+
20+
private EditText fireworksNumberEditText;
21+
22+
@Nullable
23+
@Override
24+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
25+
View root = inflater.inflate(R.layout.fragment_add_bulk_fireworks, container, false);
26+
27+
fireworksNumberEditText = (EditText) root.findViewById(R.id.add_bulk_fireworks_number);
28+
root.findViewById(R.id.add_bulk_fireworks_add_button).setOnClickListener(onAddBulkFireworksClick);
29+
return root;
30+
}
31+
32+
private final View.OnClickListener onAddBulkFireworksClick = new View.OnClickListener() {
33+
@Override
34+
public void onClick(View v) {
35+
onAddBulkFireworksClick();
36+
}
37+
};
38+
39+
private void onAddBulkFireworksClick() {
40+
if (fieldsArentFilledIn()) {
41+
notifyActivityEmptyFields();
42+
return;
43+
}
44+
45+
int numberOfFireworks = Integer.valueOf(fireworksNumberEditText.getText().toString());
46+
List<Firework> fireworks = new ArrayList<>();
47+
for (int i = 0; i < numberOfFireworks; i++) {
48+
Firework firework = new Firework("BulkFirework", "blue", "bulk", "bang", 99.9);
49+
fireworks.add(firework);
50+
}
51+
notifyActivityFireworksClicked(fireworks);
52+
clearFields();
53+
}
54+
55+
private void notifyActivityFireworksClicked(List<Firework> fireworks) {
56+
if (getActivity() instanceof AddBulkFireworksListener) {
57+
((AddBulkFireworksListener) getActivity()).onBulkAddClick(fireworks);
58+
}
59+
}
60+
61+
private void clearFields() {
62+
fireworksNumberEditText.setText("");
63+
}
64+
65+
private void notifyActivityEmptyFields() {
66+
if (getActivity() instanceof AddBulkFireworksListener) {
67+
((AddBulkFireworksListener) getActivity()).onEmptyInput();
68+
}
69+
}
70+
71+
private boolean fieldsArentFilledIn() {
72+
return checkForInput(fireworksNumberEditText);
73+
}
74+
75+
private boolean checkForInput(EditText editText) {
76+
return TextUtils.isEmpty(editText.getText()) || Integer.valueOf(editText.getText().toString()) == 0;
77+
}
78+
79+
public interface AddBulkFireworksListener {
80+
void onEmptyInput();
81+
82+
void onBulkAddClick(List<Firework> fireworks);
83+
}
84+
}

demo-extended/src/main/java/com/novoda/sqliteprovider/demo/ui/input/DemoMenu.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public interface DemoMenu {
88

99
void onAddFireworkClick(View button);
1010

11+
void onBulkAddFireworksClick(View button);
12+
1113
void onFindFireworkWithPrimaryKeyClick(View button);
1214

1315
void onFindAllFireworksFromOneShopClick(View button);

0 commit comments

Comments
 (0)