Skip to content

Commit 1bee626

Browse files
authored
Merge pull request #5 from chrisbianca/master
Allow Java database module to deal with Array data types
2 parents 6a440c3 + 911924f commit 1bee626

File tree

2 files changed

+86
-75
lines changed

2 files changed

+86
-75
lines changed

android/src/main/java/io/fullstack/firestack/FirestackDatabase.java

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -618,54 +618,4 @@ private DatabaseReference getDatabaseReferenceAtPath(final String path) {
618618
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(path);
619619
return mDatabase;
620620
}
621-
622-
623-
//private WritableMap dataSnapshotToMap(String name, String path, DataSnapshot dataSnapshot) {
624-
// return FirestackUtils.dataSnapshotToMap(name, path, dataSnapshot);
625-
//}
626-
627-
private <Any> Any castSnapshotValue(DataSnapshot snapshot) {
628-
if (snapshot.hasChildren()) {
629-
WritableMap data = Arguments.createMap();
630-
for (DataSnapshot child : snapshot.getChildren()) {
631-
Any castedChild = castSnapshotValue(child);
632-
switch (castedChild.getClass().getName()) {
633-
case "java.lang.Boolean":
634-
data.putBoolean(child.getKey(), (Boolean) castedChild);
635-
break;
636-
case "java.lang.Long":
637-
data.putDouble(child.getKey(), (Long) castedChild);
638-
break;
639-
case "java.lang.Double":
640-
data.putDouble(child.getKey(), (Double) castedChild);
641-
break;
642-
case "java.lang.String":
643-
data.putString(child.getKey(), (String) castedChild);
644-
break;
645-
case "com.facebook.react.bridge.WritableNativeMap":
646-
data.putMap(child.getKey(), (WritableMap) castedChild);
647-
break;
648-
}
649-
}
650-
return (Any) data;
651-
} else {
652-
if (snapshot.getValue() != null) {
653-
String type = snapshot.getValue().getClass().getName();
654-
switch (type) {
655-
case "java.lang.Boolean":
656-
return (Any)((Boolean) snapshot.getValue());
657-
case "java.lang.Long":
658-
return (Any) ((Long) snapshot.getValue());
659-
case "java.lang.Double":
660-
return (Any)((Double) snapshot.getValue());
661-
case "java.lang.String":
662-
return (Any)((String) snapshot.getValue());
663-
default:
664-
return (Any) null;
665-
}
666-
} else {
667-
return (Any) null;
668-
}
669-
}
670-
}
671621
}

android/src/main/java/io/fullstack/firestack/FirestackUtils.java

Lines changed: 86 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -109,32 +109,11 @@ public static WritableMap dataSnapshotToMap(
109109

110110
public static <Any> Any castSnapshotValue(DataSnapshot snapshot) {
111111
if (snapshot.hasChildren()) {
112-
WritableMap data = Arguments.createMap();
113-
for (DataSnapshot child : snapshot.getChildren()) {
114-
Any castedChild = castSnapshotValue(child);
115-
switch (castedChild.getClass().getName()) {
116-
case "java.lang.Boolean":
117-
data.putBoolean(child.getKey(), (Boolean) castedChild);
118-
break;
119-
case "java.lang.Long":
120-
Long longVal = (Long) castedChild;
121-
data.putDouble(child.getKey(), (double) longVal);
122-
break;
123-
case "java.lang.Double":
124-
data.putDouble(child.getKey(), (Double) castedChild);
125-
break;
126-
case "java.lang.String":
127-
data.putString(child.getKey(), (String) castedChild);
128-
break;
129-
case "com.facebook.react.bridge.WritableNativeMap":
130-
data.putMap(child.getKey(), (WritableMap) castedChild);
131-
break;
132-
default:
133-
Log.w(TAG, "Invalid type: " + castedChild.getClass().getName());
134-
break;
135-
}
112+
if (isArray(snapshot)) {
113+
return (Any) buildArray(snapshot);
114+
} else {
115+
return (Any) buildMap(snapshot);
136116
}
137-
return (Any) data;
138117
} else {
139118
if (snapshot.getValue() != null) {
140119
String type = snapshot.getValue().getClass().getName();
@@ -156,6 +135,88 @@ public static <Any> Any castSnapshotValue(DataSnapshot snapshot) {
156135
}
157136
}
158137

138+
private static boolean isArray(DataSnapshot snapshot) {
139+
long expectedKey = 0;
140+
for (DataSnapshot child : snapshot.getChildren()) {
141+
try {
142+
long key = Long.parseLong(child.getKey());
143+
if (key == expectedKey) {
144+
expectedKey++;
145+
} else {
146+
return false;
147+
}
148+
} catch (NumberFormatException ex) {
149+
return false;
150+
}
151+
}
152+
return true;
153+
}
154+
155+
private static <Any> WritableArray buildArray(DataSnapshot snapshot) {
156+
WritableArray array = Arguments.createArray();
157+
for (DataSnapshot child : snapshot.getChildren()) {
158+
Any castedChild = castSnapshotValue(child);
159+
switch (castedChild.getClass().getName()) {
160+
case "java.lang.Boolean":
161+
array.pushBoolean((Boolean) castedChild);
162+
break;
163+
case "java.lang.Long":
164+
Long longVal = (Long) castedChild;
165+
array.pushDouble((double) longVal);
166+
break;
167+
case "java.lang.Double":
168+
array.pushDouble((Double) castedChild);
169+
break;
170+
case "java.lang.String":
171+
array.pushString((String) castedChild);
172+
break;
173+
case "com.facebook.react.bridge.WritableNativeMap":
174+
array.pushMap((WritableMap) castedChild);
175+
break;
176+
case "com.facebook.react.bridge.WritableNativeArray":
177+
array.pushArray((WritableArray) castedChild);
178+
break;
179+
default:
180+
Log.w(TAG, "Invalid type: " + castedChild.getClass().getName());
181+
break;
182+
}
183+
}
184+
return array;
185+
}
186+
187+
private static <Any> WritableMap buildMap(DataSnapshot snapshot) {
188+
WritableMap map = Arguments.createMap();
189+
for (DataSnapshot child : snapshot.getChildren()) {
190+
Any castedChild = castSnapshotValue(child);
191+
192+
switch (castedChild.getClass().getName()) {
193+
case "java.lang.Boolean":
194+
map.putBoolean(child.getKey(), (Boolean) castedChild);
195+
break;
196+
case "java.lang.Long":
197+
Long longVal = (Long) castedChild;
198+
map.putDouble(child.getKey(), (double) longVal);
199+
break;
200+
case "java.lang.Double":
201+
map.putDouble(child.getKey(), (Double) castedChild);
202+
break;
203+
case "java.lang.String":
204+
map.putString(child.getKey(), (String) castedChild);
205+
break;
206+
case "com.facebook.react.bridge.WritableNativeMap":
207+
map.putMap(child.getKey(), (WritableMap) castedChild);
208+
break;
209+
case "com.facebook.react.bridge.WritableNativeArray":
210+
map.putArray(child.getKey(), (WritableArray) castedChild);
211+
break;
212+
default:
213+
Log.w(TAG, "Invalid type: " + castedChild.getClass().getName());
214+
break;
215+
}
216+
}
217+
return map;
218+
}
219+
159220
public static WritableArray getChildKeys(DataSnapshot snapshot) {
160221
WritableArray childKeys = Arguments.createArray();
161222

0 commit comments

Comments
 (0)