安卓工作室-如何在自己的类中实现这一点?(共享首选项)



我有一个名为"电影";其具有类似于";标题";以及";长度";等我设法使用用户界面将所需的值插入到一些编辑框中。我写了一个函数addMovie,它创建了我添加到电影数组列表中的电影对象。

之后,我想使ArrayList数据持久化。我搜索了一下,发现了这个视频:https://www.youtube.com/watch?v=jcliHGR3CHo创建者使用SharedPreferences将数据存储在应用程序存储中。然而,他将保存和加载方法直接写入到他使用它们的类中。我想创建一个专门用于保存和加载目的的类。

所以我做了这个(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实现它?

您需要一个上下文来调用getSharedPreferences。您可以将它传递给像这样的方法

public void saveData(Context ctx, ArrayList movieList) {
SharedPreferences sharedPreferences = ctx.getSharedPreferences("shared preferences", MODE_PRIVATE);
//...
}
public ArrayList<Movie> loadData(Context ctx) {
SharedPreferences ctx.sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
//...
return movieList;
}

然后用上下文(活动或应用程序上下文(调用它

addMovieBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
movieList.add(addMovie());
outputTest.setText(movieList.toString());
dm.saveData(AddMovie.this, movieList);
}
});
dm.loadData(this);

不过,正如评论中所指出的,如果这是一组使用Room数据库或其他选项(如SQL(的大型数据,则可能更有意义。然而,您的直接问题只是缺少一个上下文对象来调用该方法

相关内容

最新更新