房间数据库多次交易
Room database multiple transactions
我正在使用 Room 构建一个杂货清单应用程序,需要在包含我的 Dao 对象的列表中进行多次更新。我如何 运行 在我的对象列表中进行多次更新?我应该 运行 它们在一个线程中还是我必须为每个对象更新创建多个线程?我目前遇到的问题是,只有列表中的第一个对象得到正确更新,而其他对象被设置为 checked = false 但 listed = true。一旦线程完成所有事务更新,activity 应该重新加载。我正在使用 AsyncTaskLoader,谢谢!
杂货店 DAO
package data;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
import java.util.List;
/**
* The {@link Dao} class to run CRUD operations on the database.
*/
@Dao
public interface GroceryItemDao {
@Query("SELECT * FROM GroceryItem")
List<GroceryItem> getAllGroceries();
@Query("SELECT * FROM groceryitem WHERE is_listed = 1")
List<GroceryItem> getAllListedGroceries();
@Update
void updateGrocery(GroceryItem groceryItem);
@Insert
void insertGroceryItem(GroceryItem groceryItem);
@Delete
void delete(GroceryItem groceryItem);
}
加载器class
package loaders;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;
import java.util.List;
import data.AppDatabase;
import data.GroceryItem;
import static utils.Constant.IS_CHECKED_FALSE;
import static utils.Constant.IS_LISTED_FALSE;
public class GroceryLoaderUpdate extends AsyncTaskLoader {
public static final String TAG = "GroceryLoaderUpdate";
private List<GroceryItem> groceryItems;
private AppDatabase db;
public GroceryLoaderUpdate(Context context, List<GroceryItem> groceryItems) {
super(context);
this.groceryItems = groceryItems;
}
@Override
protected void onStartLoading() {
forceLoad();
}
@Override
public Object loadInBackground() {
db = AppDatabase.getAppDataBase(GroceryLoaderUpdate.this.getContext());
for (GroceryItem current : groceryItems) {
if (current.isChecked()) {
current.setChecked(IS_CHECKED_FALSE);
current.setListed(IS_LISTED_FALSE);
db.groceryItemDao().updateGrocery(current);
}
}
return null;
}
}
您可以使用
更新多个对象
@Update
public void updateGroceries(GroceryItem... groceryItem);
然后
db.groceryItemDao().updateGroceries(groceryItems.toArray(new GroceryItem[groceryItems.size()]));
我正在使用 Room 构建一个杂货清单应用程序,需要在包含我的 Dao 对象的列表中进行多次更新。我如何 运行 在我的对象列表中进行多次更新?我应该 运行 它们在一个线程中还是我必须为每个对象更新创建多个线程?我目前遇到的问题是,只有列表中的第一个对象得到正确更新,而其他对象被设置为 checked = false 但 listed = true。一旦线程完成所有事务更新,activity 应该重新加载。我正在使用 AsyncTaskLoader,谢谢!
杂货店 DAO
package data;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
import java.util.List;
/**
* The {@link Dao} class to run CRUD operations on the database.
*/
@Dao
public interface GroceryItemDao {
@Query("SELECT * FROM GroceryItem")
List<GroceryItem> getAllGroceries();
@Query("SELECT * FROM groceryitem WHERE is_listed = 1")
List<GroceryItem> getAllListedGroceries();
@Update
void updateGrocery(GroceryItem groceryItem);
@Insert
void insertGroceryItem(GroceryItem groceryItem);
@Delete
void delete(GroceryItem groceryItem);
}
加载器class
package loaders;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;
import java.util.List;
import data.AppDatabase;
import data.GroceryItem;
import static utils.Constant.IS_CHECKED_FALSE;
import static utils.Constant.IS_LISTED_FALSE;
public class GroceryLoaderUpdate extends AsyncTaskLoader {
public static final String TAG = "GroceryLoaderUpdate";
private List<GroceryItem> groceryItems;
private AppDatabase db;
public GroceryLoaderUpdate(Context context, List<GroceryItem> groceryItems) {
super(context);
this.groceryItems = groceryItems;
}
@Override
protected void onStartLoading() {
forceLoad();
}
@Override
public Object loadInBackground() {
db = AppDatabase.getAppDataBase(GroceryLoaderUpdate.this.getContext());
for (GroceryItem current : groceryItems) {
if (current.isChecked()) {
current.setChecked(IS_CHECKED_FALSE);
current.setListed(IS_LISTED_FALSE);
db.groceryItemDao().updateGrocery(current);
}
}
return null;
}
}
您可以使用
更新多个对象@Update
public void updateGroceries(GroceryItem... groceryItem);
然后
db.groceryItemDao().updateGroceries(groceryItems.toArray(new GroceryItem[groceryItems.size()]));