[将数据保存到领域数据库

问题描述 投票:0回答:1

我试图通过android应用中的领域来创建愿望清单。我从数据库中获取数据,并使用putExtra将它们从适配器放到SinglePost活动中。现在,我想在** SinglePost Activity **中使用Realm。但是在此代码中

RealmResults<ModelPost> results = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();

领域无法保存任何东西。因为ModelPost.class是在Adapter中定义的,而不是在Single Activity中定义的。如何在活动中使用服务器中的数据定义ModelPost?还是我可以将SinglePost活动中的数据发送到Realm数据库的方式?

适配器

public class Adapter extends RecyclerView.Adapter<Adapter.viewHolder> {
    private Context context;
    private List<ModelPost> modelPost;

    public Adapter(Context context, List<ModelPost> modelPost) {
        this.context = context;
        this.modelPost = modelPost;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_post, viewGroup, false);
        return new viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull viewHolder viewHolder, int i) {
        ModelPost modelPost = this.modelPost.get(i);
        viewHolder.textView.setText(modelPost.getTitle());
        viewHolder.cardView.setOnClickListener(v -> {
            Intent intent = new Intent(Adapter.this.context, SinglePost.class);
            intent.putExtra("ID", modelPost.getID() + "");
            intent.putExtra("Title", modelPost.getTitle() + "");
            intent.putExtra("Content", modelPost.getContent() + "");
            intent.putExtra("Category", modelPost.getCategory() + "");
            intent.putExtra("Expert", modelPost.getExpert() + "");
            intent.putExtra("Image", modelPost.getImage() + "");
            intent.putExtra("URL", modelPost.getURL() + "");
            intent.putExtra("Video", modelPost.getVideo() + "");

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        });

SinglePost活动

public class SinglePost extends AppCompatActivity {

    String id, image, url, content, video;
    int idd;
    TextView postTitle, postContent, postExpert;
    ImageView postImage, bookmark, videoPlay;
    Realm realm;
    public Adapter adapter;
    private List<ModelPost> modelPost;

    public static final String Key_Post = "ID";
...

        id = getIntent().getStringExtra("ID");
        idd = Integer.valueOf(id);
        postTitle.setText(getIntent().getStringExtra("Title"));
        postExpert.setText(getIntent().getStringExtra("Expert"));
        image = getIntent().getStringExtra("Image");
        url = getIntent().getStringExtra("URL");
        content = (getIntent().getStringExtra("Content"));
        video = (getIntent().getStringExtra("Video"));


        realm = Realm.getDefaultInstance();
        RealmResults<ModelPost> result = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();
        if (result.size() != 0) {
            bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp);
        } else {
            bookmark.setImageResource(R.drawable.ic_bookmark_border_black_24dp);
        }

        Bookmark();

    }
    private void Bookmark() {

        bookmark.setOnClickListener(v -> realm.executeTransaction(realm -> {
            RealmResults<ModelPost> results = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();
            if (results.size() == 0) {
                realm.copyToRealm(modelPost);
                bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp);
                Toast.makeText(getApplicationContext(), "Added to Wishlist", Toast.LENGTH_SHORT).show();
            } else {
                results.get(0).deleteFromRealm();
                bookmark.setImageResource(R.drawable.ic_bookmark_border_black_24dp);
Toast.makeText(getApplicationContext(), "Removed from Wishlist", Toast.LENGTH_SHORT).show();
            }
        }));
    }

ModelPost

package com.example.petraa.Model;

import java.io.Serializable;

import io.realm.RealmObject;
import io.realm.annotations.LinkingObjects;
import io.realm.annotations.PrimaryKey;

public class ModelPost extends RealmObject implements Serializable {
    int ID;
    private String Title;
    private String Image;
    private String Content;
    private String Category;
    private String Expert;
    private String URL;
    private String Video;

    public ModelPost() {

    }

    public Integer getID() {
        return ID;
    }

    public void setID(Integer ID) {
        this.ID = ID;
    }

    public String getTitle() {
        return Title;
    }

    public void setTitle(String title) {
        Title = title;
    }

    public String getImage() {
        return Image;
    }

    public void setImage(String image) {
        Image = image;
    }

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }

    public String getCategory() {
        return Category;
    }

    public void setCategory(String category) {
        Category = category;
    }

    public String getExpert() {
        return Expert;
    }

    public void setExpert(String expert) {
        Expert = expert;
    }

    public String getURL() {
        return URL;
    }

    public void setURL(String URL) {
        this.URL = URL;
    }

    public String getVideo() {
        return Video;
    }

    public void setVideo(String video) {
        Video = video;
    }
}

java android realm
1个回答
0
投票

所以,我的理解是适配器中(基于RealmModel的)ListModelPost将同时包含Realm中的项目和非Realm中的项目,其中“ in realm”等同于“ marked” 。来自适配器的流看起来还不错,它(通过意图)传递了对象的ID(用于从Realm检索)及其所有数据(对于不在Realm中的对象)。

我认为这会使事情变得复杂-您确定要这样做吗?通过跨意图传递整个对象数据,然后您需要在另一侧重新创建对象,以后添加字段也意味着在此处进行额外的维护。如果所有对象都在领域中会更好,但是通过布尔字段表示书签状态。这样,您只需要在活动中更改该标志的状态,就可以在意图中传递ID,因为它可以保证在域中。

即在SinglePost ...]

modelPost = realm.where(ModelPost.class).equalTo(Key_Post, idd).findFirst();

然后Bookmark()更改...

bookmark.setOnClickListener(v -> realm.executeTransaction(realm -> {
  modelPost.isBookmarked = !modelPost.isBookmarked;
  if (modelPost.isBookmarked) {
    bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp);
    Toast.makeText(getApplicationContext(), "Added to Wishlist", Toast.LENGTH_SHORT).show();
  } else {
    bookmark.setImageResource(...);
    Toast.makeText(getApplicationContext(), "Removed from Wishlist", Toast.LENGTH_SHORT).show();
  }
}));

如果您确实想添加/删除对象,那么您将需要根据传递的数据在活动中创建modelPost对象(而非List)。这可能会让您满意,但对我来说却很难闻,我建议您使用其他选项。

顺便说一句,将ID的传递更改为本地使用整数;更改

intent.putExtra("ID", modelPost.getID() + "");

to

intent.putExtra("ID", modelPost.getID());

并在活动侧使用getIntExtra()

© www.soinside.com 2019 - 2024. All rights reserved.