I am planning to retrieve the student userName and userStudNum in (User) database and store it in (StoreInfo) database. But it gives me null value. Help me Fix it
StoreInfo:
User:
I have 2 java file. scanner.java
this scanner.java will setText for textview when qr are scanned. But just like in firebase, it store null value.
public class scanner extends Drawable {
Button qrbtn;
public static FusedLocationProviderClient fusedLocationProviderClient;
public static TextView qrtext, id, arrival, date, address, name, studNum;
public static int REQUEST_CODE = 100;
private FirebaseUser currentUser;
DatabaseReference usersRef;
ActivityScannerBinding activityScannerBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityScannerBinding = ActivityScannerBinding.inflate(getLayoutInflater());
setContentView(activityScannerBinding.getRoot());
allocateActivityTitle("Attendance Scanner");
qrbtn = (Button) findViewById(R.id.qrbtn);
qrtext = (TextView) findViewById(R.id.qrtext);
arrival = (TextView) findViewById(R.id.arrival);
date = (TextView) findViewById(R.id.date);
id = (TextView) findViewById(R.id.deviceId);
name = (TextView) findViewById(R.id.name);
studNum = (TextView) findViewById(R.id.studentNum);
address = (TextView) findViewById(R.id.location);
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
// saveUser();
qrbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getApplicationContext(), qrscanner.class));
getLocation();
saveUser();
}
});
}
private void getLocation() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
fusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
try {
Geocoder geocoder = new Geocoder(scanner.this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
address.setText("Location: " + addresses.get(0).getAddressLine(0)
);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
} else {
askPermission();
}
}
private void askPermission() {
ActivityCompat.requestPermissions(scanner.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLocation();
} else {
Toast.makeText(scanner.this, "Please provide the required permission", Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void saveUser() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("User");
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String nameString = dataSnapshot.child("userName").getValue(String.class);
String studNumString = dataSnapshot.child("userStudNo").getValue(String.class);
name.setText("" + nameString);
studNum.setText("" + studNumString);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
qrscanner.java
public class qrscanner extends Drawable implements ZXingScannerView.ResultHandler
{
ZXingScannerView scannerView;
DatabaseReference dbref, usersRef;
private FirebaseUser currentUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
scannerView = new ZXingScannerView(this);
setContentView(scannerView);
//saveUser();
dbref = FirebaseDatabase.getInstance().getReference("StoreInfo");
currentUser = FirebaseAuth.getInstance().getCurrentUser();
usersRef = FirebaseDatabase.getInstance().getReference("User");
Dexter.withContext(getApplicationContext())
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
scannerView.startCamera();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
}).check();
}
@Override
public void handleResult(Result result) {
String data = result.getText().toString();
Date dateAndTime = (Date) Calendar.getInstance().getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.getDefault());
SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm:ss", Locale.getDefault());
String date = dateFormat.format(dateAndTime);
String time = timeFormat.format(dateAndTime);
String deviceId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
getLocation();
saveUser();
String locationString = scanner.address.getText().toString();
String name = scanner.name.getText().toString();
String studNum = scanner.studNum.getText().toString();
StoreInfo storeInfo = new StoreInfo(data, date, time, deviceId, locationString, name, studNum);
dbref.push().setValue(storeInfo).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
scanner.qrtext.setText("Course: " + data);
scanner.date.setText("Date: " + date);
scanner.arrival.setText("Arrival time: " + time);
scanner.id.setText("Device Id: " + deviceId.toString());
scanner.address.setText("Location: " + locationString);
scanner.name.setText("Name: " + name);
scanner.studNum.setText("Student Number: " + studNum);
onBackPressed();
}
});
}
private void saveUser() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("User");
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String nameString = dataSnapshot.child("userName").getValue(String.class);
String studNumString = dataSnapshot.child("userStudNo").getValue(String.class);
name.setText("" + nameString);
studNum.setText("" + studNumString);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});}
private void getLocation() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
fusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
try {
Geocoder geocoder = new Geocoder(qrscanner.this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
scanner.address.setText("Location: " + addresses.get(0).getAddressLine(0)
);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
} else {
askPermission();
}
}
private void askPermission() {
ActivityCompat.requestPermissions(qrscanner.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLocation();
} else {
Toast.makeText(qrscanner.this, "Please provide the required permission", Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
protected void onPause() {
super.onPause();
scannerView.stopCamera();
}
@Override
protected void onResume() {
super.onResume();
scannerView.setResultHandler(this);
scannerView.startCamera();
}
}
qrscanner.java will store the info of user in StoreInfo database
You're loading the User
node, and then read the userName
property from under that. But there is no userName
property under User
, as there's an extra layer in your JSON (201-0001
in the screenshot).
You have to account for that extra layer, for example by looping over the children of dataSnapshot
:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("User");
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { // 👈 loop over child nodes
String nameString = userSnapshot.child("userName").getValue(String.class);
String studNumString = userSnapshot.child("userStudNo").getValue(String.class);
name.setText("" + nameString);
studNum.setText("" + studNumString);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // 👈 never ignore errors
}
});