当前位置: 首页 > 知识库问答 >
问题:

使用Arraylist填充Room数据库

微生令
2023-03-14

我习惯于使用Arraylist,下面您可以看到我为存储数据所做的尝试:

这就是我尝试过的,但遗憾的是,这并不奏效:

private void populateDB(final List<TransferDeck> mTransferDeck) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    List<SaveDeck> mSaveDeck = new ArrayList<>();
                    for(int i = 0; i<mTransferDeck.size(); i++){
                        mSaveDeck.add(new SaveDeck(i, "FirstSavedDeck", mTransferDeck.get(i).getCardImage() ,mTransferDeck.get(i).getTypeImage(), mTransferDeck.get(i).getCost(), mTransferDeck.get(i).getName(), mTransferDeck.get(i).getNumber()));
                    }
                    mSavedDecksDB.deckBuilderDao().insertCards(mSaveDeck);

                }
            }).start();
}

下面你可以找到我剩下的代码,但上面的一个应该足以让我清楚的想要做什么...

public SaveDeck(int _id, String deckName, int cardImage, int typeImage, Integer cardCost, String cardName, Integer cardNumber) {
    this._id = _id;
    DeckName = deckName;
    CardImage = cardImage;
    TypeImage = typeImage;
    CardCost = cardCost;
    CardName = cardName;
    CardNumber = cardNumber;
}

@ColumnInfo(name = "DeckName")
private String DeckName;

@ColumnInfo(name = "CardImage")
private int CardImage;

@ColumnInfo(name = "TypeImage")
private int TypeImage;

@ColumnInfo(name = "CardCost")
private Integer CardCost;

@ColumnInfo(name = "CardName")
private String CardName;

@ColumnInfo(name = "CardNumber")
private Integer CardNumber;

}

我创建了Dao类,如下所示::-

@DAO公共接口DeckBuilderDao{

@Insert(onConflict = OnConflictStrategy.IGNORE)
public long[] insertCards(SaveDeck... saveDecks);

@Insert(onConflict = OnConflictStrategy.IGNORE)
public long insertCard(SaveDeck saveDecks);

@Update
public int updateCardBaseEntries(SaveDeck... saveDecks);

@Update
public int updateCardBaseEntry(SaveDeck saveDecks);

@Delete
public int deleteCardBaseEntried(SaveDeck... saveDecks);

@Delete
public int deleteCardBaseEntry(SaveDeck saveDecks);

@Query("SELECT * FROM SaveDeck")
public SaveDeck[] getAllDecks();

//probably I do not need the getAllDecks Query. Right now I only need the following one:
@Query("SELECT * FROM SaveDeck WHERE DeckName = :NameOfDeck ORDER  BY DeckName, CardName")
public SaveDeck getOneDeck(String NameOfDeck);
@Database(entities = {SaveDeck.class}, version = 1)
public abstract class SaveDecksDataBase extends RoomDatabase {
    public abstract DeckBuilderDao deckBuilderDao();
}
private List<TransferDeck> mTransferDeck = DataHolder.getInstance().savedDecklistTransfer;
SaveDecksDataBase mSavedDecksDB;
Cursor mCursor;

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//return super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.review_fragment, container, false);

    /*Introduce Cards Recycler*/

    RecyclerView rvCards = view.findViewById(R.id.rv_review_cardlist);
    rvCards.setLayoutManager(new GridLayoutManager(getActivity(), 5));
    review_RViewAdapter_Cards adapterCards = new review_RViewAdapter_Cards(getContext(), mTransferDeck);
    rvCards.setAdapter(adapterCards);



    /*Init Room database*/
    mSavedDecksDB = Room.databaseBuilder(getActivity(),SaveDecksDataBase.class,"SavedDecksDB.db").build();
    populateDB(mTransferDeck);

    return view;
}

private void populateDB(final List<TransferDeck> mTransferDeck) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            List<SaveDeck> mSaveDeck = new ArrayList<>();
            for(int i = 0; i<mTransferDeck.size(); i++){
                mSaveDeck.add(new SaveDeck(i, "FirstSavedDeck", mTransferDeck.get(i).getCardImage() ,mTransferDeck.get(i).getTypeImage(), mTransferDeck.get(i).getCost(), mTransferDeck.get(i).getName(), mTransferDeck.get(i).getNumber()));
            }
            mSavedDecksDB.deckBuilderDao().insertCards(mSaveDeck);

        }
    }).start();
}

共有1个答案

巫马昆琦
2023-03-14

我想提一下,这应该是一个评论,而不是一个回答。

首先,或者使用AYSNCTask或者使用更健壮的executors.NewSingleThreadExecutor()。如果您更喜欢第二个,那么最好创建一个helper类(示例)。示例

private void populateDB(final List<TransferDeck> mTransferDeck) {
    AppExecutors.diskIO().execute(() -> {

        for(int i = 0; i<mTransferDeck.size(); i++){
            mSavedDecksDB.deckBuilderDao().insertCards(new SaveDeck(...);
        }

    });
}

(1)创建一个空白构造函数。

(4)房间数据库不应该在那里初始化,如果是单例的最好。因此,您的数据库类(3)可以如下所示:

public abstract class SaveDecksDataBase extends RoomDatabase {

   private static SaveDecksDataBase sINSTANCE;
   private static final Object LOCK = new Object();

   public static SaveDecksDataBase getDatabase(final Context context) {
        if (sINSTANCE == null) {
            synchronized (LOCK) {
                if (sINSTANCE == null) {
                    sINSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            SaveDecksDataBase.class, "SavedDecksDB.db")
                            .build();
                }
            }
        }
        return sINSTANCE;
    }

    public abstract DeckBuilderDao deckBuilderDao();
}

最后,要获得SaveDeck对象,还必须使用ExecutorsAsyncTask在后台完成工作,然后填充RecycerView

  1. Android Room数据库
  2. 练习集
 类似资料:
  • 问题内容: 我的Android应用程序需要使用中填充ListView数据ArrayList。 我这样做很麻烦。有人可以帮我提供代码吗? 问题答案: 你需要通过进行操作,以使ArrayList(或任何其他集合)适应布局中的项目(ListView,Spinner等)。 这是Android开发人员指南所说的: 一个管理任意对象数组支持的。默认情况下,此类期望提供的资源ID引用单个。如果要使用更复杂的布局

  • 问题内容: 我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder jTable。 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回其中包含参数数据和列的tableModel,因为我知道在GUI中执行此方法是一种不好的做法。在线上的所有教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它看不到数据和列,

  • 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回包含参数数据和列的tableModel,因为我知道在我的GUI中使用这种方法是不好的做法。所有在线教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它无法看到数据和列,因为它们是在我的方法的一个不可访问的部分中声明和使用的。在我完成这些之后,我需要找到一种方法来将它传递给我的GUI类

  • 我想使用预先填充的数据库的房间,但我不明白如何告诉房间在哪里找到我的数据库。 现在我将它放在中,当我为房间数据库创建实例时,我是这样创建的: 这样一来,我认为它每次都在创建一个新的数据库,或者说,它没有使用预填充的数据库。 我怎样才能找到我的数据库?

  • 当我试图更改数据库中表的模式/数据时,我遇到了一个无法解决的问题。我正在用Rooms.CreateFromAsset方法预填充数据库。 当我使用以下代码构建数据库时: 和这个数据类:

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $