android - 如何从 Firebase 实时数据库中完全删除值?
问题描述
我在数据库中创建了一个数组。通过应用程序的代码,我从数组中获取值并且我想将其删除,但是为了使代码正常工作,我希望将值完全删除,也就是说,数组必须以“0”重新开始,但在帮助下removeValue () 命令的它只是分配一个空值。如何从数据库中删除一个值?
我都尝试了removeValue
and setValue (null)
,但它仍然用 null 替换了 base 中的值。
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
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.Map;
public class MainActivity extends AppCompatActivity {
Button mButtonSee;
TextView mTextViewPromo;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mPromoRef =
mRef.child("delivery").child("0").child("promokod");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSee = findViewById(R.id.buttonSee);
mTextViewPromo = findViewById(R.id.promo);
mButtonSee.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPromoRef.addListenerForSingleValueEvent(new
ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String text = dataSnapshot.getValue(String.class);
mTextViewPromo.setText(text);
mPromoRef.removeValue();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
}
结果,我想在单击按钮时从第一个数组中获取一个值,然后再次删除它以再次从新的第一个数组中获取值。
它的数据库结构:
我的新代码:
public class MainActivity extends AppCompatActivity {
Button mButtonSee;
TextView mTextViewPromo;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mPromoRef = mRef.child("delivery");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSee = findViewById(R.id.buttonSee);
mTextViewPromo = findViewById(R.id.promo);
mButtonSee.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPromoRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
LinkedList<String> values = new LinkedList<>();
boolean isFirst = true;
for (DataSnapshot codeSnapshot: dataSnapshot.getChildren()) {
if (isFirst) {
isFirst = false;
}
else {
String text = codeSnapshot.getValue(String.class);
values.add(text);
}
}
mPromoRef.setValue(values);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
});
}
}
而logcat:2019-02-20 02:11:25.263 1631-2110/? E/AudioFlinger:AudioTrack size=131296 内存不足
2019-02-20 02:11:25.263 1631-2110/? E/AudioFlinger: createRecordTrack_l() initCheck failed -12; 没有控制块?
2019-02-20 02:11:25.267 1631-12210/? I/AudioFlinger:AudioFlinger的线程0xef703a00 tid=12210准备运行
2019-02-20 02:11:25.269 2651-11949/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord 返回错误 -12
2019-02-20 02:11:25.269 2651-11949/com.google.android.googlequicksearchbox:search E/AudioRecord: AudioFlinger 无法创建记录轨道,状态:-12
2019-02-20 02:11:25.271 2651-11949/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI:创建 AudioRecord 实例时出错:初始化检查失败,状态为 -12。
2019-02-20 02:11:25.274 2651-11949/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord:初始化本机 AudioRecord 对象时出现错误代码 -20。
2019-02-20 02:11:25.274 2651-11949/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_started SR: 16000 CC: 16 SO: 6
2019-02-20 02:11:25.275 2651-11949/com.google.android.googlequicksearchbox:search E/ActivityThread: 找不到 com.google.android.apps.gsa.testing.ui.audio.recorded 的提供者信息
跑:
E/AndroidRuntime:致命异常:主进程:com.example.ru.puddig,PID:12504 com.google.firebase.database.DatabaseException:无法将 java.util.HashMap 类型的值转换为 com.google.firebase 处的字符串.database.core.utilities.encoding.CustomClassMapper.convertString(com.google.firebase:firebase-database@@16.0.6:413) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com .google.firebase:firebase-database@@16.0.6:199) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@16.0.6: 79) 在 com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.6:212) 在 com.example.ru.puddig.MainActivity$1$1.onDataChange(MainActivity.java :54) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.6:183) 的 com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@16.0.6:183) google.firebase:firebase-database@@16.0.6:75) 在 com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.6:63) 在com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.6:55) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect .Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 运行(RuntimeInit.java:493)
解决方案
请查看这个 firebase 博客,其中他们提到了如何将数组与 firebase 一起使用。要为您的问题总结一下,请从博客中获取以下观点。
- 要删除键,我们保存整个数组而不是使用 .remove()
推荐阅读
- powershell - 如何在 PowerShell 中转义特殊字符?
- c# - 如何创建以随机间隔发射项目的无限 Observable 序列?
- c++ - 头文件问题;“重新定义阶级”
- apache - Installing multiple RSA SSL certificates with Apache for one website
- javascript - 如何使用javascript从多个连续跨度中获取单个组合字符串
- python - 之后应该调用什么小部件?
- active-directory - 在循环依赖的情况下使用 1.2.840.113556.1.4.1941 实现是否安全?
- ruby-on-rails - How can I route to a belongs_to table in Rails (using PostgreSQL)?
- r - Error with Multi-variate Time Series clustering using dtwclust - There are missing values in the series
- python - 如何将从 cv2.findContours 获得的 NumPy 数组转换为 Shapely 多边形?