【问题标题】:Android Studio - How to implement this in an own class? (Shared Preferences)Android Studio - 如何在自己的类中实现这一点? (共享偏好)
【发布时间】: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


【解决方案1】:

您需要一个上下文来调用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;
}

然后使用上下文(Activity 或应用程序上下文)调用它

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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多