如何在Firebase Android

时间:2019-10-31 00:28:09

标签: android firebase-realtime-database

[已解决。我自己解决了] 提示:如果您要访问Firebase实时数据库中的某个子项以收集数据,然后通过使用该数据在Firebase实时数据库中再次存储或上载该子项的内容,则无法访问它。您必须创建另一个孩子,或者您不得使用该孩子。 (我没有实际的解决方案,但对我有用)] 我想根据用户电话号码创建一个孩子。该孩子将容纳一个或多个孩子。这些孩子将被称为该项目的“ serialNo”。并且在serialNo child下,将存储商品名称和件数。我想这样创建:

The desire Firebase Structure

[N:B:我是直接在Firebase上创建的,而不是由我的应用程序创建的。]

但是当我将数据对象设置为.setValue(dtObject)时,前一个将始终被替换。 "orderNo: 1" child was replaced by "orderNo: 2" child

我也使用.updateChildren(dtMap),但每次以前的订单都没有替换任何子项。

我的确认片段代码(从我上传的地方):

package com.binarysoftwareltd.airaid;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;
import java.util.Map;

public class AddressFragment extends Fragment {
private int orderNo = 1;
private int orderSerial = 0;
private DatabaseReference dbReference, dbr;
private static final String STATE_USER = "user";
private String mUser;
private View oldView;
private TextView numWarning;
private EditText nameField, phoneField, areaField, addressField, 
detailsField;
private CardView confirmCV;
private int len;
private String nameOfPerson, phoneNumber, areaName, addressOfOrder, 
detailsOfOrder;
private int[] serialNos = new int[100];
private String[] names = new String[100];
private int[] pieces = new int[100];
private String imageUri;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mUser = savedInstanceState.getString(STATE_USER);
    } else {
        // Probably initialize members with default values for a new 
instance
        mUser = "NewUser";
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString(STATE_USER, mUser);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (oldView != null) {
        return oldView;
    }
    View v = inflater.inflate(R.layout.fragment_address, container, 
false);
    initializeAll(v);
    Bundle bundle = getArguments();
    if (bundle != null) {
        len = bundle.getInt("cValue");
        imageUri = bundle.getString("imgUri");
        serialNos = bundle.getIntArray("mSerialNos");
        names = bundle.getStringArray("mNames");
        pieces = bundle.getIntArray("mPieces");
    }
    confirmCV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            collectAllData();
            if (!phoneNumber.equals("")) {
                checkOrderSerial();
            } else {
                phoneField.requestFocus();
                Toast.makeText(getContext(), orderSerial, 
Toast.LENGTH_SHORT).show();
            }
        }
    });
    oldView = v;
    return v;
}

private void checkOrderSerial() {
dbr=FirebaseDatabase.getInstance().getReference(phoneNumber). 
child("currentOrderSerial");
    dbr.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Integer value = dataSnapshot.getValue(Integer.class);
            if (value != null)
                orderSerial = value;
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    showConfirmDialog();
}

private void showConfirmDialog() {
    AlertDialog.Builder alb = new AlertDialog.Builder(getContext());
    alb.setIcon(R.drawable.question);
    alb.setTitle("Confirm");
    alb.setMessage("Are you sure want to order?");
    alb.setPositiveButton(R.string.exit_no, new 
DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    alb.setNegativeButton(R.string.exit_yes, new 
DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            setOrderSerial();
        }
    });
    AlertDialog ald = alb.create();
    ald.show();
}

private void setOrderSerial() {
    dbr = FirebaseDatabase.getInstance().getReference(phoneNumber);
    if (orderNo <= orderSerial) {
        orderNo = orderSerial;
        orderNo += 1;
    }
    OrderSerial osObject = new OrderSerial(orderNo);
    dbr.setValue(osObject);
    uploadAllData();
}

private void uploadAllData() {
    dbReference = 
FirebaseDatabase.getInstance().getReference(phoneNumber).child("orderNo: 
"+orderNo);
    DataTemplate dtObject;
    int i;
    for (i = 0; i < len; i++) {
        if (pieces[i] != 0) {
            dtObject = new DataTemplate(names[i],pieces[i]);
            dbReference.child("serialNo: 
"+serialNos[i]).setValue(dtObject);
        }
    }
}

private void collectAllData() {
    nameOfPerson = nameField.getText().toString();
    phoneNumber = phoneField.getText().toString();
    areaName = areaField.getText().toString();
    addressOfOrder = addressField.getText().toString();
    detailsOfOrder = detailsField.getText().toString();
}

private void initializeAll(View v) {
    numWarning = v.findViewById(R.id.numWarning);
    nameField = v.findViewById(R.id.nameField);
    phoneField = v.findViewById(R.id.phoneField);
    areaField = v.findViewById(R.id.areaField);
    addressField = v.findViewById(R.id.addressField);
    detailsField = v.findViewById(R.id.detailsField);
    confirmCV = v.findViewById(R.id.confirmCV);
}
}

我的OrderSerial类::

package com.binarysoftwareltd.airaid;

public class OrderSerial {

private int currentOrderSerial;

public OrderSerial() {

}

public OrderSerial(int currentOrderSerial) {
    this.currentOrderSerial = currentOrderSerial;
}

public int getCurrentOrderSerial() {
    return currentOrderSerial;
}

public void setCurrentOrderSerial(int currentOrderSerial) {
    this.currentOrderSerial = currentOrderSerial;
}
}

AddressFragment的XML代码:

 <?xml version="1.0" encoding="utf-8"?>
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/app_main_bg"
 android:orientation="vertical">

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="120dp"
        android:text="@string/address_fragment_title"
        android:textColor="@color/pureBlack"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:gravity="center"
        android:id="@+id/numWarning"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginTop="5dp"
        android:layout_marginEnd="15dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:text="@string/number_warning"
        android:textColor="@color/img_warning"
        android:textSize="15sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"
        android:gravity="center_vertical"
        android:weightSum="8"
        android:orientation="horizontal">

        <ImageView
            android:contentDescription="@string/name_field"
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_weight="1"
            android:src="@drawable/ic_person"/>

        <EditText
            android:id="@+id/nameField"
            android:layout_marginStart="5dp"
            android:layout_width="0dp"
            android:layout_weight="7"
            android:layout_height="70dp"
            android:hint="@string/name_field" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"
        android:gravity="center_vertical"
        android:weightSum="8"
        android:orientation="horizontal">

        <ImageView
            android:contentDescription="@string/phone_field"
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_weight="1"
            android:src="@drawable/ic_phone"/>

        <EditText
            android:id="@+id/phoneField"
            android:layout_marginStart="5dp"
            android:inputType="phone"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="4"
            android:hint="@string/phone_field" />

        <EditText
            android:id="@+id/areaField"
            android:layout_marginStart="10dp"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="3"
            android:hint="@string/area_field" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"
        android:gravity="center_vertical"
        android:weightSum="8"
        android:orientation="horizontal">

        <ImageView
            android:contentDescription="@string/address_fragment_title"
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_weight="1"
            android:src="@drawable/ic_location"/>

        <EditText
            android:id="@+id/addressField"
            android:layout_marginStart="5dp"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="7"
            android:hint="@string/address_fragment_title" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"
        android:gravity="center_vertical"
        android:weightSum="8"
        android:orientation="horizontal">

        <ImageView
            android:contentDescription="@string/details_field"
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_weight="1"
            android:src="@drawable/ic_details"/>

        <EditText
            android:id="@+id/detailsField"
            android:layout_marginStart="5dp"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="7"
            android:hint="@string/details_field" />

    </LinearLayout>

    <androidx.cardview.widget.CardView
        android:id="@+id/confirmCV"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:clickable="true"
        android:focusable="true"
        android:layout_marginStart="15dp"
        android:layout_marginTop="15dp"
        android:layout_marginEnd="15dp"
        app:cardCornerRadius="18dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/card_view_bg"
            android:gravity="center">

            <ImageView
                android:contentDescription="@string/order_now"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/ic_confirm" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="5dp"
                android:text="@string/order_now"
                android:textColor="@color/pureWhite"
                android:textSize="18sp" />
        </LinearLayout>

     </androidx.cardview.widget.CardView>

 </LinearLayout>

 </ScrollView>


 here my JSON::
 {
 "23" : {
  "currentOrderSerial" : 2,
 "orderNo: 2" : {
   "serialNo: 1" : {
     "name" : "napa Extra",
     "piece" : 200
   }
 }
 }
 }

[我使用电话号码作为每个用户的主要标识符。因此,必须提供电话号码。] 请帮助解决此问题... 在此先感谢...

0 个答案:

没有答案