【问题标题】:Store integer value into a variable from firebase将整数值存储到来自 firebase 的变量中
【发布时间】:2022-02-19 17:49:21
【问题描述】:

我有这个小问题,我正在尝试从我的 firebase 数据库中获取一个数字,问题是我可以获取该数字,但似乎我做错了将它存储在一个整数中。

我要做的是从 firebase 获取数字并将其与我的应用程序的版本号进行比较,这样我就可以告诉我的用户在应用程序高于我当前版本时更新应用程序

这是我的代码

mDatabase.child("version").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               // System.out.println(dataSnapshot.getValue());
                //Log.e("Versiondeapp",""+dataSnapshot.getValue());
                int ultimaVersion = (int) dataSnapshot.getValue();
                if(versionCode!=ultimaVersion){
                    ActualizarAppAlert();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

我的问题就在这里

int ultimaVersion = (int) dataSnapshot.getValue();

似乎我无法将该数值从 firebase 存储到整数变量

我当前的堆栈错误

java.lang.NullPointerException:尝试调用虚拟方法'int 空对象引用上的 java.lang.Integer.intValue()'

PS:我这样做解决了我的问题 Integer.valueOf(datasnapshot.getvalue().tostring());

【问题讨论】:

  • 请添加您的数据库结构和您使用Integer.intValue()的行。
  • 嗨 @AlexMamo 我没有使用 Integer.intValue()

标签: android firebase firebase-realtime-database


【解决方案1】:

据我所知,它与 Firebase 并不完全相关。
我认为您首先需要检查为什么您的对象为 null,而不仅仅是将其转换为 int (这就是您所需要的):

Integer.valueOf(dataSnapShot.getValue())

另外考虑到根据Firebase documentation: getValue() 返回的可能类型有:

Boolean  
Long  
Double  
Map<String, Object>  
List<Object>  

【讨论】:

  • 如果我用 datasnapshot.getvalue 做一个 Log.e ,我得到的值是 "34" ,在我的数据库中是一样的
  • 好的。当您写“34”时,您的意思是它的字符串?
  • 它是一个整数,而不是一个字符串
  • 请尝试 Integer.valueOf(datasnapshot.getvalue())。
  • 而应该是(Long) datasnapshot.getValue(),因为它已记录在您在答案中提到的内容
【解决方案2】:

如果您绝对确定该值将是一个 int 数字,那么这对您有用。

if(dataSnapshot.exists() && dataSnapshot.getValue()!= null){
    int ultimaVersion = ((Long) dataSnapshot.getValue()).intValue();
}

【讨论】:

    【解决方案3】:

    科特林

    val result = dataSnapshot.value.toString()
    desiredVariable = result.toInt()
    

    【讨论】:

      【解决方案4】:

      要解决这个问题,请更改这行代码:

      int ultimaVersion = (int) dataSnapshot.getValue();
      

      到:

      int ultimaVersion = dataSnapshot.getValue(Integer.class);
      

      【讨论】:

        【解决方案5】:
        mDatabase.child("version").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        // System.out.println(dataSnapshot.getValue());
                        //Log.e("Versiondeapp",""+dataSnapshot.getValue());
                        int ultimaVersion =  ds.getValue(Integer.class);
                        if(versionCode!=ultimaVersion){
                            ActualizarAppAlert();
                    }
        
                    }
                }
        
                @Override
                public void onCancelled(DatabaseError databaseError) {
        
                }
            });
        

        试试这个..

        【讨论】:

        • Java 中没有int.class
        【解决方案6】:
        package rifqi.firebaseiotawal;
        
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.widget.TextView;
        
        
        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.concurrent.atomic.AtomicInteger;
        
        import static android.R.id.message;
        
        
        public class MainActivity extends AppCompatActivity {
        private TextView txt;
        
        
           private FirebaseDatabase database = FirebaseDatabase.getInstance();
           private DatabaseReference myRef = database.getReference();
        private  DatabaseReference mchild = myRef.child("adc");
        
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
         txt = (TextView) findViewById(R.id.text1);
        txt.setText("hai");
            }
        @Override
            protected void onStart () {
            super.onStart();
            mchild.addValueEventListener(new ValueEventListener() {
        
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Integer adc = dataSnapshot.getValue(Integer.class);
                        txt.setText(""+  adc);
        
                }
        
                @Override
                public void onCancelled(DatabaseError databaseError) {
        
                }
            });
        }
        }
        

        你可以试试这个代码,它对我有用...我把 "" 放在变量 adc 前面作为数据类型

        【讨论】:

          【解决方案7】:

          这对我有用

          int variableName=documentSnapshot.getLong("field name").intValue();
          

          【讨论】:

            【解决方案8】:

            简单的做

            int ultimaVersion = Integer.parseInt(dataSnapshot.getValue()+"");
            

            这里我们刚刚将一个空字符串附加到 Long 值,以便生成一个完整的字符串并使用 parseInt 将其全部转换为整数

            【讨论】:

              【解决方案9】:

              这不是答案,但我必须分享它,它会帮助其他人。因此,如果您将整数存储到 Firebase 数据库,它将始终作为长对象返回。 公认的答案是正确的解决方案,但是如果您希望将对象作为具有不同变量的模型类返回怎么办?

              所以在这里你可以使用这个方法来获取对象作为模型类,

                 //pass datasnapShot and your.class as object
                 public static Object snapshotToClass(DataSnapshot snapshot, Object object) throws IllegalAccessException {
                       
                       if (object == null) {
                           throw new NullPointerException();
                       }
              
                       Field[] fields = object.getClass().getFields();
              
                       if (fields.length > 0) {
                            for (Field field : fields) {
                                 String name = field.getName();
                                 if (snapshot.hasChild(name)) {
                                      Object o = snapshot.child(name).getValue();
                                      field.set(object, o);
                                 }
                            }
                        }
              
                  return object;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-05-16
                • 1970-01-01
                • 2014-04-26
                • 1970-01-01
                • 2023-03-09
                • 1970-01-01
                • 2018-01-31
                • 1970-01-01
                相关资源
                最近更新 更多