Это будет долгий путь, садитесь. ?.
Прежде всего я хотел бы заменить идентификаторы базы данных натуральными числами. Для этого вам нужно изменить способ добавления новых элементов:
Создать класс AddNewItems:
package com.<package-name>;
public class AddNewItems {
private String name;
private String section;
private String price;
private int id;
public AddNewItems() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Теперь давайте вернемся к вашей основной деятельности, откуда вы добавляете новые элементы. Измените addItem()
на следующее:
AddNewItems addNewItems; //Add this below your DatabaseReference databaseItems;
private void addItems(){
String Name = editTextItemName.getText().toString().trim();
String Price = editTextPrice.getText().toString().trim();
String Section = spinnerSection.getSelectedItem().toString();
String lastItemIdFetched; //This will check ID of last item and assign new value to new items.
Int lastIdInt; //For adding 1, we need to convert to int
//Make sure you read the note at bottom
if (ItemName.isEmpty()) {
editTextItemName.setError("Item Name can't be empty");
editTextItemName.requestFocus();
return;
}
if (Price.isEmpty()) {
editTextPrice.setError("Price can't be empty");
editTextPrice.requestFocus();
return;
} else {
//For sake of automating new ID
DatabaseReference addItemIdRef;
addItemIdRef = FirebaseDatabase.getInstance().getReference("itemIDs");
addItemIdRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
lastItemIDFetched = dataSnapshot.child("lastItemID").getValue().toString();
lastIdInt = Integer.parseInt(lastItemIdFetched);
lastIdInt = lastIdInt + 1;
}catch (Throwable e){
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
// Adding data in database
addNewItems.setName(Name);
addNewItems.setSection(Section);
addNewItems.setPrice(Price);
addNewItems.setId(lastIdInt);
databaseItems.child(lastIdInt).setValue(addNewItems);
Toast.makeText(getApplicationContext(), "New Item has been added to your menu.", Toast.LENGTH_SHORT).show();
// We also need to value of last ID in database. So do this.
Map<String, Object> updateNewID = new HashMap<>();
updateNewID.put("lastItemID", lastIdInt);
addItemIdRef.child("lastItemID).updateChildren(updateNewID).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getApplicationContext(), "Success on updating", Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
});
//WE have successfully updated the last item ID
}
}
ПРИМЕЧАНИЕ: По мере извлечения lastItemID
из базы данных. Нет кода для проверки, если это первый элемент или нет, и может привести к Cra sh. Если вы не хотели увеличивать код (который уже есть), пожалуйста, создайте следующее вручную из консоли.
![enter image description here](https://i.stack.imgur.com/9ybkI.png)
Создайте новый узел, как показано, и установите значение 0, поэтому при добавлении первого элемента его идентификатор будет 1.
Теперь, возвращаясь к части извлечения, сделайте это в вашей функции onStart()
: давайте сделаем это, используя список:
//Create a listView in XML also and define it in MainActivity.
//ListView listItems = (ListView) findViewById(R.id.resource_name);
//First create a list and adapter
ArrayList<String> listItems=new ArrayList<String>();
ArrayAdapter<String> adapter;
DatabaseReference fetchItemsRef;
fetchItemsRef = FirebaseDatabase.getInstance().getReference("items");
DatabaseReference getTotalNumberOfItemsRef;
getTotalNumberOfItemsRef = FirebaseDatabase.getInstance().getReference("itemIDs");
Int i, totalNumberOfItems;
//I've again added this to check number items available.
//Put this in your `onStart()` function.
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
setListAdapter(adapter);
//Get total number of items:
getTotalNumberOfItemsRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
totalNumberOfItems = Integer.parseInt(dataSnapshot.child("lastItemID").getValue().toString());
}catch (Throwable e){
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
//Now let's fetch the data from Firebase using a `for loop`:
for(int i=0; i<=totalNumberOfItems; i++){
String currentItemName = "item"+i;
fetchItemsRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
currentItemName = dataSnapshot.child(i).getValue().toString();
}catch (Throwable e){
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
listItems.add(currentItemName);
adapter.notifyDataSetChanged();
}
Теперь вы должны убедиться, что все элементы в вашей базе данных являются непрерывными целыми числами. как 1,2,3 ... и не должно быть 1,2,4,5,8 ... потому что нет кода, который может обрабатывать нулевые объекты. Вы можете добавить это, используя условные операторы позже.