sql >> データベース >  >> RDS >> SQLite

Android RoomEmbeddedRelationはSQLwhere条件を無視します

    これは、単純なコンバーターが原因であるか、Itemsエンティティがどのように定義されているかによると思いますブール値を使用しました) isexcluded コンバーターがなくても正常に動作するようです)

    それは私のバージョンのItemsエンティティを使用しています:-

    @Entity(foreignKeys = @ForeignKey(entity = Category.class,parentColumns = "id", childColumns = "category", onDelete =  CASCADE))
    public class Items {
        @PrimaryKey(autoGenerate = true)
        private long id;
        private String category;
        private boolean isexcluded;
    
    
        public void setCategory(String category) {
            this.category = category;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public void setIsexcluded(boolean isexcluded) {
            this.isexcluded = isexcluded;
        }
    
        public String getCategory() {
            return this.category;
        }
    
        public long getId() {
            return this.id;
        }
    
        public boolean isIsexcluded() {
            return this.isexcluded;
        }
    }
    

    のカテゴリDAOと一緒に:-

    @Dao
    interface CategoryDAO {
        @Query("SELECT * FROM Category")
        List<Category> getAllcategories();
    
        @Query("SELECT DISTINCT Category.* " +
                "FROM CATEGORY " +
                "INNER JOIN ITEMS ON category.id = Items.category " +
                "WHERE isexcluded = 0 " +
                "ORDER BY lower(category.name)")
        List<Category> getSpeacial();
    
        @Query("SELECT DISTINCT Category.* " +
                "FROM CATEGORY " +
                "INNER JOIN ITEMS ON category.id = Items.category " +
                "WHERE isexcluded = 0 " +
                "ORDER BY lower(category.name)")
        List<CatViewWithItemList> getSpeacial2();
    
        @Insert
        public long[] insertCategory(Category... Category);
    }
    

    と一緒に
    new Thread(new Runnable() {
                @Override
                public void run() {
                    //mRoomDB.categoryDao().insertCategory(initialCategories());
                    //mRoomDB.itemsDAO().insertItem(initialItems());
                    List<Category> categoryList = mRoomDB.categoryDao().getAllcategories();
                    List<Items> itemsList = mRoomDB.itemsDAO().getAllItems();
                    for (Category c: categoryList) {
                        Log.d("CATEGORY","Category is " + c.getName() + " refrence is " + c.getId());
                    }
                    for (Items i: itemsList) {
                        Log.d("ITEM","Item is " + i.getId() + " Category reference is " + i.getCategory() + " Is Excluded is " + Boolean.toString(i.isIsexcluded()));
                    }
                    List<Category> categoryList2 = mRoomDB.categoryDao().getSpeacial();
                    for (Category c: categoryList2) {
                        Log.d("CATEGORY2","Category is " + c.getName() + " reference is " + c.getId());
                    }
                    List<CatViewWithItemList> catViewWithItemLists = mRoomDB.categoryDao().getSpeacial2();
                    for (CatViewWithItemList cvwil: catViewWithItemLists) {
                        Log.d("CATVIEWITEM","Category = " + cvwil.myCat.getId() + " ID = " + cvwil.ItemList.get(0).getId() + " IsExcluded = " + Boolean.toString(cvwil.ItemList.get(0).isIsexcluded()));
                    }
                }
            }).start();
    

    と:-

    public class CatViewWithItemList {
    
        @Embedded
        public Category myCat;
    
        @Relation(parentColumn = "id",
                entityColumn = "category")
        public List<Items> ItemList;
    }
    

    その結果は次のようになります(パート1の基礎となるデータ(ああ、3番目のスペルはできません:))):-

    2018-12-19 21:47:05.376 2109-2125/? D/CATEGORY: Category is firstname refrence is a
    2018-12-19 21:47:05.377 2109-2125/? D/CATEGORY: Category is secondname refrence is b
    2018-12-19 21:47:05.377 2109-2125/? D/CATEGORY: Category is thridname refrence is c
    2018-12-19 21:47:05.377 2109-2125/? D/ITEM: Item is 1 Category reference is a Is Excluded is false
    2018-12-19 21:47:05.377 2109-2125/? D/ITEM: Item is 2 Category reference is c Is Excluded is false
    2018-12-19 21:47:05.377 2109-2125/? D/ITEM: Item is 3 Category reference is null Is Excluded is false
    2018-12-19 21:47:05.377 2109-2125/? D/ITEM: Item is 4 Category reference is b Is Excluded is false
    2018-12-19 21:47:05.377 2109-2125/? D/ITEM: Item is 5 Category reference is b Is Excluded is true
    2018-12-19 21:47:05.378 2109-2125/? D/ITEM: Item is 6 Category reference is null Is Excluded is true
    

    次に、2セットの結果:-

    2018-12-19 21:47:05.379 2109-2125/? D/CATEGORY2: Category is firstname reference is a
    2018-12-19 21:47:05.380 2109-2125/? D/CATEGORY2: Category is secondname reference is b
    2018-12-19 21:47:05.380 2109-2125/? D/CATEGORY2: Category is thridname reference is c
    
    
    2018-12-19 21:47:05.382 2109-2125/? D/CATVIEWITEM: Category = a ID = 1 IsExcluded = false
    2018-12-19 21:47:05.382 2109-2125/? D/CATVIEWITEM: Category = b ID = 4 IsExcluded = false
    2018-12-19 21:47:05.382 2109-2125/? D/CATVIEWITEM: Category = c ID = 2 IsExcluded = false
    

    追加

    あなたの問題はクエリではなく、 CatViewItemListにあると思います クエリに関係なく、またはクエリの後に、カテゴリに関連するすべてのアイテムをアイテムのリストに入力します(つまり、アイテムのリストをカテゴリに埋め込みます)。これは、特定の関連アイテムのみが本当に必要なため、私を混乱させました(コードの1番目を取得しただけです)。 cvwil.ItemList.get(0).isIsexcluded() 運が良かったのは、4が5の前に来るので、除外されたものがfalseとして表示されることです。

    カテゴリに参加して、アイテムからこれにアプローチする必要があると思います。

    のようなもの
    SELECT * 
    FROM Items 
    JOIN Category ON Items.category = category.id
    WHERE Items.isexcluded = 0 
    ORDER BY category.name ASC;
    

    これを行うためにgitHubのコードを更新しました(Categoryテーブルを categoryidの一意の列名を持つように変更したことに注意してください idではなく)

    結果は次のようになります(別のカテゴリが追加され、さらに2つのアイテムが逆の順序になっていることに注意してください。つまり、最初のアイテム(id 7)がtrueとして除外され、次にid 8がfalseになります):-

    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/CATEGORY: Category is firstname Category ID is a
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/CATEGORY: Category is secondname Category ID is b
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/CATEGORY: Category is thirdname Category ID is c
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/CATEGORY: Category is fourthname Category ID is d
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 1 Category reference is a Is Excluded is false
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 2 Category reference is c Is Excluded is false
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 3 Category reference is null Is Excluded is false
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 4 Category reference is b Is Excluded is false
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 5 Category reference is b Is Excluded is true
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 6 Category reference is null Is Excluded is true
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 7 Category reference is d Is Excluded is true
    2018-12-20 21:39:56.971 9136-9160/so53839431.so53839431roomrelationship D/ITEM: Item is 8 Category reference is d Is Excluded is false
    2018-12-20 21:39:56.972 9136-9160/so53839431.so53839431roomrelationship D/ITEMWITHCAT: Item id =1 Category reference is a Is Excluded is false Referenced Category is a Referenced Category name is firstname
    2018-12-20 21:39:56.972 9136-9160/so53839431.so53839431roomrelationship D/ITEMWITHCAT: Item id =2 Category reference is c Is Excluded is false Referenced Category is c Referenced Category name is thirdname
    2018-12-20 21:39:56.972 9136-9160/so53839431.so53839431roomrelationship D/ITEMWITHCAT: Item id =4 Category reference is b Is Excluded is false Referenced Category is b Referenced Category name is secondname
    2018-12-20 21:39:56.972 9136-9160/so53839431.so53839431roomrelationship D/ITEMWITHCAT: Item id =8 Category reference is d Is Excluded is false Referenced Category is d Referenced Category name is fourthname
    



    1. XMLファイルをPostgreSQLにインポートする

    2. 同一のプロパティを持つタイムゾーン名は、タイムスタンプに適用すると異なる結果になります

    3. 設計によるSQLデッドロックゼロ-コーディングパターンはありますか?

    4. 主キーにignore_dup_keyをオンに設定できますか?