【发布时间】:2022-01-13 19:02:16
【问题描述】:
我有一个名为“电影”的类,它具有“标题”和“长度”等属性。 我设法使用用户界面将想要的值插入到一些编辑框中。 我编写了一个函数 addMovie,它创建了我添加到 Movie-ArrayList 中的 Movie-Object。
之后我想让 ArrayList 数据持久化。 我搜索了一下,发现了这个视频:https://www.youtube.com/watch?v=jcliHGR3CHo 创建者使用 SharedPreferences 将数据存储在 App-Storage 中。 然而,他将保存和加载方法直接写到他使用它们的类中。 我想创建一个专门用于保存和加载的类。
所以我做了这个(DataManger.java):
package com.example.watchassistant;
import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class DataManager {
public void saveData(ArrayList movieList) {
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(movieList);
editor.putString("movie list", json);
editor.apply();
}
public ArrayList<Movie> loadData() {
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("movie list", null);
Type type = new TypeToken<ArrayList<Movie>>() {
}.getType();
ArrayList<Movie> movieList;
movieList = gson.fromJson(json, type);
if (movieList == null) {
movieList = new ArrayList<>();
}
return movieList;
}
电影在此处创建 (AddMovie.java):
package com.example.watchassistant;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class AddMovie extends AppCompatActivity {
//Filmliste
static ArrayList<Movie> movieList = new ArrayList<Movie>();
static DataManager dm = new DataManager();
//Variablen um Film zu erstellen
String title = "";
String releaseDate = "";
String genre = "";
String watchedAt = "";
String ratingConv ="";
double rating = 0.0;
String comment = "";
String lengthMinutes = "";
String stream = "";
String test = "";
//Buttons
Button addMovieBtn;
//Inputboxen
private EditText inputTitle;
private EditText inputGenre;
private EditText inputWatchedAt;
private EditText inputStream;
private EditText inputReleased;
private EditText inputRating;
private EditText inputLength;
private EditText inputComment;
//Outputboxen
private TextView outputTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_movie);
//dm.loadData();
//Zuweisen der Elemente zu den Objekten
addMovieBtn = (Button) findViewById(R.id.addMovieButton);
inputTitle = (EditText) findViewById(R.id.titleInput);
inputGenre = (EditText) findViewById(R.id.genreInput);
inputWatchedAt = (EditText) findViewById(R.id.watchedInput);
inputStream = (EditText) findViewById(R.id.streamingInput);
outputTest = (TextView) findViewById(R.id.outputView);
//Button Event Film Hinzufügen
addMovieBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
movieList.add(addMovie());
outputTest.setText(movieList.toString());
dm.saveData(movieList);
}
});
}
public Movie addMovie() {
//Needed
title = inputTitle.getText().toString();
genre = inputGenre.getText().toString();
watchedAt = inputWatchedAt.getText().toString();
stream = inputStream.getText().toString();
//Optional
//releaseDate = inputReleased.getText().toString();
//ratingConv = inputRating.getText().toString();
//rating = Double.parseDouble(ratingConv);
//comment = inputComment.getText().toString();
//lengthMinutes = inputLength.getText().toString();
Movie m1 = new Movie(title, releaseDate, genre, stream, watchedAt, rating, comment, lengthMinutes);
return m1;
}
}
在 DataManger.java 我有以下问题:
Cannot resolve method 'getSharedPreferences' in 'DataManager'
Cannot resolve symbol 'MODE_PRIVATE'
Cannot resolve method 'getSharedPreferences' in 'DataManager'
Cannot resolve symbol 'MODE_PRIVATE'
谁能告诉我一个解决方案吗?或者至少告诉我是否有可能实现我正在尝试的目标。谢谢!
编辑: 在eclipse中我使用了这样的东西:
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
//Zuständig für das Speichern der Daten für die Wiederbenutzung nachdem das Programm beendet wurde
public class ResourceManager {
//Speichern
public static void saveList(Serializable data, String filename) throws Exception
{
try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get(filename))))
{
oos.writeObject(data);
}
}
//Laden
public static ArrayList loadList(String filename) throws Exception
{
ArrayList<Movie> movieList;
try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get(filename))))
{
movieList = (ArrayList<Movie>) ois.readObject(); // casting object
return movieList;
}
}
}
如何在android上实现?
【问题讨论】:
-
你为什么要这样做?您正在将数据序列化为 json - 为什么不将其保存为 json 文件?将其添加到共享首选项是不必要的,会增加混乱,并且会降低您拥有的任何其他共享首选项的性能。共享首选项不是“将所有数据存储在这里”的事情。它是一个快速的键值查找,应该保存诸如设置和少量持久数据之类的数据。不是您应用的主要数据存储。
-
感谢您的评论。我是初学者,在网上搜索后,我大多找到了共享偏好解决方案。所以你的意思是我应该将 Arraylist 保存为 json 文件?我理解正确吗?
标签: java android android-studio sharedpreferences