Я запускаю addValueEventListener
для моей базы данных Firebase методом, который запускает onClick
кнопки. он извлекает снимок данных с данными пользователя, а затем запускает цикл for, который присваивает переменные точкам данных, чтобы их можно было сохранить в базе данных sqlite. последний шаг - проверить, существует ли URL-адрес firebaseStorage, указывающий на наличие сохраненного изображения как части данных пользователя для данной «дыры», и если это так, его необходимо преобразовать в байтовый массив. если его нет, приложение определяет байтовый массив как ноль, а затем в обоих случаях приложение должно .put данные в базу данных.
Я обнаружил, что цикл for работает беспорядочно, то есть не завершает процесс по порядку. Кроме того, в большинстве случаев, даже несмотря на то, что в моментальном снимке данных четко присутствуют данные, они не сохраняются в переменной 90% времени. наконец, в некоторых случаях, хотя есть greenURL, приложение не слушает .onSuccess
или .onFailure
.
похоже, что это проблема синхронизации, связанная с тем, что onDataChange
является асинхронным. Я попытался создать его так, чтобы он не продвигался до завершения процесса, но, возможно, я ошибаюсь. вот мой код:
String holeNumbers[] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"};
SharedPreferences preferences = getApplicationContext().getSharedPreferences("MyPreferences", MODE_PRIVATE);
String selectedCourse = preferences.getString("selectedCourse","");
myDb = FirebaseDatabase.getInstance().getReference();
myDb.child("UserNotesData").child("Users").child(uid).child(selectedCourse).child(selectedNotes).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (String x:holeNumbers) {
String hole = "Hole"+x ;
String holeNumberNotes = x;
System.out.println("Hole at beginning of DownloadUserNotesData for loop: "+ x);
if (dataSnapshot.child(hole).child("ApproachIdealMiss").getValue() != null) {
approachIdealMiss = dataSnapshot.child(hole).child("ApproachIdealMiss").getValue().toString();
} else {
approachIdealMiss = "";
}
if (dataSnapshot.child(hole).child("ApproachNotes").getValue() != null) {
approachNotes = dataSnapshot.child(hole).child("ApproachNotes").getValue().toString();
} else {
approachNotes = "";
}
String greenImageURL;
if (dataSnapshot.child(hole).child("GreenImageURL").getValue() != null) {
greenImageURL = dataSnapshot.child(hole).child("GreenImageURL").getValue().toString();
} else {
greenImageURL = "N/A";
}
if (dataSnapshot.child(hole).child("GreenNotes").getValue() != null) {
greenNotes = dataSnapshot.child(hole).child("GreenNotes").getValue().toString();
} else {
greenNotes = "";
}
if (dataSnapshot.child(hole).child("TeeIdealMiss").getValue() != null) {
teeIdealMiss = dataSnapshot.child(hole).child("TeeIdealMiss").getValue().toString();
} else {
teeIdealMiss = "";
}
if (dataSnapshot.child(hole).child("TeeNotes").getValue() != null) {
teeNotes = dataSnapshot.child(hole).child("TeeNotes").getValue().toString();
} else {
teeNotes = "";
}
if (dataSnapshot.child(hole).child("TeeShot").getValue() != null) {
teeShot = dataSnapshot.child(hole).child("TeeShot").getValue().toString();
} else {
teeShot = "";
}
if (dataSnapshot.child(hole).child("goZone1X").getValue() != null) {
goZone1X = dataSnapshot.child(hole).child("goZone1X").getValue().toString();
} else {
goZone1X = "";
}
if (dataSnapshot.child(hole).child("goZone1Y").getValue() != null) {
goZone1Y = dataSnapshot.child(hole).child("goZone1Y").getValue().toString();
} else {
goZone1Y = "";
}
if (dataSnapshot.child(hole).child("goZone2X").getValue() != null) {
goZone2X = dataSnapshot.child(hole).child("goZone2X").getValue().toString();
} else {
goZone2X = "";
}
if (dataSnapshot.child(hole).child("goZone2Y").getValue() != null) {
goZone2Y = dataSnapshot.child(hole).child("goZone2Y").getValue().toString();
} else {
goZone2Y = "";
}
if (dataSnapshot.child(hole).child("noZone1X").getValue() != null) {
noZone1X = dataSnapshot.child(hole).child("noZone1X").getValue().toString();
} else {
noZone1X = "";
}
if (dataSnapshot.child(hole).child("noZone1Y").getValue() != null) {
noZone1Y = dataSnapshot.child(hole).child("noZone1Y").getValue().toString();
} else {
noZone1Y = "";
}
if (dataSnapshot.child(hole).child("noZone2X").getValue() != null) {
noZone2X = dataSnapshot.child(hole).child("noZone2X").getValue().toString();
} else {
noZone2X = "";
}
if (dataSnapshot.child(hole).child("noZone2Y").getValue() != null) {
noZone2Y = dataSnapshot.child(hole).child("noZone2Y").getValue().toString();
} else {
noZone2Y = "";
}
if(!greenImageURL.equals("N/A")) {
StorageReference greenStorageRef = storage.getReferenceFromUrl(greenImageURL);
final long ONE_MEGABYTE = 1024 * 1024;
greenStorageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
helperDB.insertUserNotesData(x, approachIdealMiss, approachNotes, greenImageURL, bytes,
greenNotes, teeIdealMiss, teeNotes, teeShot, goZone1X, goZone1Y, goZone2X, goZone2Y, noZone1X, noZone1Y, noZone2X, noZone2Y);
System.out.println("(greenImageSuccess) hole# to be written in db is: " + x);
System.out.println("(greenImageSuccess) TeeNotes to be written in db are: " + approachNotes);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
System.out.println("(greenImage was not blank but failed to be changed to bytes) hole# to be written in db is: "+ x);
}
}); }
else {
byte[] emptyByte = new byte[0];
helperDB.insertUserNotesData(x, approachIdealMiss, approachNotes, greenImageURL, emptyByte,
greenNotes, teeIdealMiss, teeNotes, teeShot, goZone1X, goZone1Y, goZone2X, goZone2Y, noZone1X, noZone1Y, noZone2X, noZone2Y);
System.out.println("(greenImageBlank) hole# to be written in db is: "+ x);
System.out.println("(greenImageBlank) TeeNotes to be written in db are: "+approachNotes);
}
}
loadingPercent = loadingPercent + 30;
loadingProgressBar.setProgress(loadingPercent, true);
System.out.println("loadingProgress at DownloadUserNotesData: " + loadingPercent.toString());
if (loadingPercent==100) {
Intent intent = new Intent (courseSelect.this, PlayNav.class);
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Вот соответствующая (ish) распечатка из консоли, которую я попытался использовать для отладки:
V/FA: Processing queued up service tasks: 4
D/EGL_emulation: eglMakeCurrent: 0xa7805780: ver 3 0 (tinfo 0xa78039e0)
I/System.out: (greenImageSuccess) hole# to be written in db is: 2
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 3
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 1
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 6
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 11
I/System.out: (greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 8
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 12
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 10
I/System.out: (greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is: 14
(greenImageSuccess) TeeNotes to be written in db are:
W/Google Maps Android API: Deprecation notice: In a future release, indoor will no longer be supported on satellite, hybrid or terrain type maps. Even where indoor is not supported, isIndoorEnabled() will continue to return the value that has been set via setIndoorEnabled(), as it does now. By default, setIndoorEnabled is 'true'. The API release notes (https://developers.google.com/maps/documentation/android-api/releases) will let you know when indoor support becomes unavailable on those map types.
I/System.out: (greenImageSuccess) hole# to be written in db is: 13
(greenImageSuccess) TeeNotes to be written in db are:
I/System.out: (greenImageSuccess) hole# to be written in db is