Android Room插入所有问题

Jér*_*ôme 10 java database sqlite android android-room

我开始使用Android Room,我遇到了一些麻烦.

我有一个7 Orders的ArrayList,当我调用insertAll(List orders)时,只有4个订单被插入到数据库中.

如何调试插入查询以查找阻塞内容?

谢谢

joa*_*o86 17

Room执行的调用不是同步的,因此可能在您执行时

List<Order> myOrders = mDb.getOrderDao().getAll()
Run Code Online (Sandbox Code Playgroud)

它仍在插入订单.

试试这个

@Dao 
public interface OrderDao { 
    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    public long insertOrder(Order order); 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    void insertAllOrders(List<Order> order); 

    @Query("SELECT * FROM orders") 
    List<Order> getAll(); 
 }

@Entity(tableName = TABLE_NAME) 
public class Order { 
   public static final String TABLE_NAME = "orders"; 
   @PrimaryKey (autoGenerate = true)
   private int id; 
   @SerializedName("order_number") 
   @ColumnInfo(name = "order_number") 
   private String orderNumber; 
} 

// Call 
mDb.getOrderDao().insertAllOrders(orders);
Log.d(TAG, "inserted all");

Executor executor = Executors.newSingleThreadExecutor();

executor.execute(new Runnable() {
        @Override
        public void run() {

             List<Order> myOrders = mDb.getOrderDao().getAll();
             Log.d(TAG, "Orders nr = " + myOrders.size()); 
        }
});
Run Code Online (Sandbox Code Playgroud)

  • 这不是真的.房间插入是同步的,所以当insertAll返回时,将插入所有数据.而且,即使您尝试从另一个线程读取该数据,您也永远不会收到部分数据.insert(List <>)会自动放入一个事务中,因此任何其他并行查询都可以在插入所有这些之前或在插入所有这些之后查看db. (2认同)

Dip*_*rma 7

必须添加 OnConflict 属性。

@Insert(onConflict = OnConflictStrategy.REPLACE) 
Run Code Online (Sandbox Code Playgroud)