【问题标题】:DBFlow One to many exampleDBFlow 一对多示例
【发布时间】:2015-12-25 14:41:30
【问题描述】:

在 DBFlow git 的入门页面上: https://github.com/Raizlabs/DBFlow/blob/master/usage/GettingStarted.md

他们解释了如何创建一对多关系,但有一点不清楚,Android Studio 抱怨这些部分:

.where(Ant_Table.queenForeignKeyContainer_id.eq(id))

Ant_Table 是从哪里来的?需要声明吗?

queenForeignKeyContainer_id 也是如此。

【问题讨论】:

    标签: android database orm flow


    【解决方案1】:
    1. Ant_Table 来自哪里?

    Ant_Table 不需要声明。类是在你编译你的项目后生成的(实际上DBFlow使用java注解来生成这些源代码)。

    所以你可以先注释这些错误的代码,然后编译这些模型类。然后 DBFlow 会为你生成一些代码,现在你可以取消这些代码的注释。

    1. queenForeignKeyContainer_id 也是由 DBFlow 生成的。

    【讨论】:

    • 我也有同样的情况。我的表名为 MyDBEntry,我有 MyDBEntry$Table 类,但没有 MyDBEntry_Table。该类只有一些字符串,方法“eq”不存在。
    • 也许您使用的是旧版本的 dbflow。旧的 dbflow 使用的是 '$' 而不是 '_'。
    • 可能是。我的是 2.1.0
    【解决方案2】:

    我遇到了同样的问题。最后通过将 where 条件建模为字符串来解决它,如下所示:

    String fieldName = MyDBEntry$Table.NOTIFICATIONID;
    long value = parent.getId();
    final String whereClause = String.format("%s = %d", fieldName, value);
    TransactionManager.getInstance().addTransaction(
        new SelectListTransaction<>(
            new Select().from(MyDBEntry.class)
                .where(whereClause),
                    new TransactionListenerAdapter<List<MyDBEntry>>() {
                        @Override
                        public void onResultReceived(List<MyDBEntry> dbList) {
                            ...
                        }
                    })
    );
    

    只需将 fieldName 和 value 替换为您想要的值

    【讨论】:

      【解决方案3】:

      如果 Ant_Table 无法编译,请确保您已设置 Application 类。 Ant_Table 作为最后一个类,外键成员表示您添加到架构中以关联两个表的内容。 更不用说在文档中提到这一点真的很令人困惑。

      【讨论】:

        【解决方案4】:
        @Table(database = AppDatabase.class)
        public class Department extends BaseModel {
        
        @Column
        @PrimaryKey(autoincrement = true)
        private int d_id;
        
        @Column
        @Unique
        public String department_name;
        
        public String getDepartment_name() {
            return department_name;
        }
        
        public void setDepartment_name(String department_name) {
            this.department_name = department_name;
        }
        
        public int getD_id() {
            return d_id;
        }
        
        
        public void setD_id(int d_id) {
            this.d_id = d_id;
        }
        }
        

        这是我的部门表

        @Table(database = AppDatabase.class)
        
        public class CompleteProfile extends BaseModel {
        
        
            @Column
            @PrimaryKey(autoincrement = true)
            int id;
        
            @Column
            @Unique
            private String stud_username;
        
            @Column
            @Unique
            private String stud_password;
        
            @Column
            private int d_id;
        
        
            public String getStud_username() {
                return stud_username;
            }
        
            public void setStud_username(String stud_username) {
                this.stud_username = stud_username;
            }
        
            public String getStud_password() {
                return stud_password;
            }
        
            public void setStud_password(String stud_password) {
                this.stud_password = stud_password;
            }
        
            List<Department> departments;
        
            @OneToMany(methods = OneToMany.Method.ALL, variableName = "departments")
            public List<Department> dbFlowOneTwoManyUtilMethod() {
                if (departments == null) {
                    departments = SQLite.select()
                            .from(Department.class)
                            .where(Department_Table.d_id.eq(d_id))
                            .queryList();
                }
                return departments;
            }
        
            public void setD_id(int d_id) {
                this.d_id = d_id;
            }
        
            public int getD_id() {
                return d_id;
            }
        }
        

        完整的Profile表(模型类)引用部门表,d_id为外键

         Cursor cursor = new Select(Department_Table.department_name, CompleteProfile_Table.stud_username, CompleteProfile_Table.stud_password)
                            .from(Department.class)
                            .join(CompleteProfile.class, Join.JoinType.INNER)
                            .on(Department_Table.d_id.withTable()
                                    .eq(CompleteProfile_Table.d_id.withTable())).query();
        
                    cursor.moveToFirst();
                    while (!cursor.isAfterLast()) {
                        Log.e("USERNAME=", cursor.getString(1));
                        Log.e("PASSWORD=", cursor.getString(2));
                        Log.e("DEPARTMENT NAME=", cursor.getString(0));
        
        
                        cursor.moveToNext();
                    }
                    // make sure to close the cursor
                    cursor.close();
        

        这是从两个表中获取数据的查询

        【讨论】:

        【解决方案5】:

        好的,所以当我尝试制作项目时,我没有看到显示的 gradle 构建错误。

        但即使有消息,仍然不清楚。我需要执行以下操作:文件>使缓存无效/重新启动

        重启后,当我再次尝试制作项目时,错误很明显。 似乎 DBFlow 没有足够的信息来说明哪个字段可以/应该是可见的或(在我的情况下是私有的),所以我有一个带有 getter 和 setter 的私有主键,这导致外键出现问题。

        刚把private去掉,问题就解决了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-22
          • 2017-08-19
          • 1970-01-01
          • 2013-11-11
          • 1970-01-01
          • 2011-02-24
          相关资源
          最近更新 更多