我想在用户输入编辑文本时保存数据。
它可以在recyclerView上显示,应用程序重新启动时应用程序可以再次显示它。
我尝试用户共享偏好,我可以让recyclerView在用户输入编辑文本时显示数据。
但是当我想保存数据并获取数据时,布局会让我的应用程序崩溃。
我发现崩溃代码是 String getUserInputBlood = preferences.getString(" uerInputBlood","");
我该如何解决?任何帮助都将不胜感激。
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_blood_sugar_report"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.huaweb_system.taiwanuniversityhome.BloodSugarReportActivity">
<EditText
android:id="@+id/editBloodSugar"
android:text="543"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/sendBlood"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerBloodReport"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
活性:
public class BloodSugarReportActivity extends AppCompatActivity {
private RecyclerView recyclerBloodReport;
private BloodSugarReportAdapter myAdapter;
private List<String> listData = new ArrayList<>();
private EditText editBloodSugar;
private Button sendBlood;
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_sugar_report);
editBloodSugar = (EditText) findViewById(R.id.editBloodSugar);
sendBlood=(Button)findViewById(R.id.sendBlood);
sendBlood.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uerInputBlood = editBloodSugar.getText().toString();
preferences=getSharedPreferences("uerInputBlood",MODE_PRIVATE);
editor=preferences.edit();
editor.putString("uerInputBlood",uerInputBlood);
editor.commit();
//show user input edit text successful-------------
listData.add(uerInputBlood);
}
});
//i try to use getString to get it that i saved.-----------
//it will crash
String getUserInputBlood = preferences.getString("uerInputBlood", "");
listData.add(getUserInputBlood);
recyclerBloodReport = (RecyclerView) findViewById(R.id.recyclerBloodReport);
recyclerBloodReport.setLayoutManager(new LinearLayoutManager(this));
myAdapter=new BloodSugarReportAdapter(this,listData);
recyclerBloodReport.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
}
@Override
protected void onResume() {
super.onResume();
//of course , it's not working from here
String getUserInputBlood = preferences.getString("uerInputBlood", "");
listData.add(getUserInputBlood);
}
}
答案 0 :(得分:2)
如果您有大量数据,则需要使用SQL。如果您想使用共享首选项,可以尝试:
private void saveBlood(){
SharedPreferences preferences = getSharedPreferences("uerInputBlood", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
listData.clear();
editor.putInt("count", listData.size());
for(int i=0; i<listData.size(); i++){
editor.putString("blood"+i, listData.get(i));
}
editor.commit();
}
private void restoreBlood(){
listData.clear();
SharedPreferences preferences = getSharedPreferences("uerInputBlood", MODE_PRIVATE);
int tmpCount = preferences.getInt("count", 6);
for(int i=0; i<tmpCount; i++){
listData.add(preferences.getString("blood"+i, ""));
}
}
希望有所帮助:)
答案 1 :(得分:0)
尝试将myAdapter.notifyDataSetChanged();
移至onResume()
的末尾。您在onCreate()
中不需要它,因为您刚刚创建了该适配器,并且数据在之后没有发生变化。
此外,您无需在onCreate()
和onResume()
中调用此部分。从onCreate()
中删除它。您只需将相同的项目两次添加到列表中:
String getUserInputBlood = preferences.getString("uerInputBlood", "");
listData.add(getUserInputBlood);
SharedPreferences
通常用于存储应用程序所需的一些键/值数据项。它们不用于存储列表。
如果您尝试存储所有列表值,则应使用其他形式的数据存储,例如:一个SQLite数据库。有关详细信息,请参阅storage options
答案 2 :(得分:0)
尝试使用 Sqlite 数据库
就您而言,在 SQLite 上执行此操作比共享首选项要容易得多。
看看这个https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase
很高兴为您提供帮助:-)