0

这是我的数据库:

@Database(name = GamersDatabase.NAME, version = GamersDatabase.version)
public class GamersDatabase {
        public static final String NAME = "and_roid";
        public static final int version = 1;
}

这是我的桌子:

@Table(database = GamersDatabase.class)
public class Gamers extends BaseModel{
        @PrimaryKey(autoincrement = true)
        int id;

        @Column@NotNull
        String name;
 }

这是我的插入语句,效果很好(因为下面的选择语句返回正确的列表大小):

TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels()));
//insert          
SQLite.insert(Gamers.class).columns(Gamers_Table.name.getDefinition() ).values("ali").execute();

这是我的选择声明:

 List<Gamers> w = SQLite.select().from(Gamers.class).where(Gamers_Table.fName.eq("ali")).queryList();
 for (Gamers o : w) {
        // The problem is this part that I can't get gamer's name
        Toast.makeText(MainActivity.this, ""+o.toString(), Toast.LENGTH_SHORT).show();
 }

因此,如果 DBFlow 是一个ORM系统,我如何获取我的对象并将其作为我们在正常sqlite cursor方法中拥有的游戏玩家对象的行为?如果问题不清楚,我应该添加评论:

在旧式数据库方法中,我们使用SQLite如下查询:

Cursor c = db.getRawQuery("select * from tbl_gamers" , null);
if(c.moveToFirst()){
// fill object
}

然后使用我们填充的对象,现在我如何才能访问 DBFlow 检索到的对象的字段(如nameid)?

4

2 回答 2

0

我很困惑您在选择查询中同时使用了不同的表和字段名称。如果我使用您的 Workers 表的声明值,它对我来说很好。

List<Workers> workers = SQLite.select()
             .from(Workers.class)           
             .where(Workers_Table.name.eq("ali"))                    
             .queryList(); 

但我想这不是重点。也许您的问题是 Workers 类的字段是包本地的。只需将它们公开或提供公共 getter 即可访问它们。

@Table(database = GamersDatabase.class)
public class Workers extends BaseModel{
        @PrimaryKey(autoincrement = true)
        public int id;

        @Column@NotNull
        public String name;
 }

请注意,我对 DBFlow 也不是很熟悉,但我认为您的 TransactionManager 没有做任何事情。根据此处的文档,您应该传递要保存的模型列表。在使用 SaveModelsTransaction 出现一些问题后,使用以下代码对我来说效果很好:

 TransactionManager.transact(GamersDatabase.NAME, new Runnable() {
        @Override
        public void run() {
            Workers worker = new Workers();
            worker.name = "ali";
            worker.save();
        }
    });

希望这可以帮到你。

问候,

亚历克斯

于 2016-01-27T21:05:44.887 回答
0

我也为此苦苦挣扎。这里的列表包含一种指针或存储在内存中的对象的位置(虽然我不确定),例如:

Workers List: 
           [com.example.workers.receiver.schema@1a4b1622, 
           com.example.workers.receiver.schema@1302f8b3, 
           com.example.workers.receiver.schema@d7c9e70,]

以上是终端上的输出,使用:

Log.d(TAG, "Workers List: "+w);

您将能够使用以下命令打印日志中的数据:

List<Gamers> w = SQLite.select()
                    .from(Gamers.class)
                    .where(Gamers_Table.name.eq("ali"))
                    .queryList();
for (int i=0;i<w.size();i++) {
    Log.d(TAG, ""+w.get(i).name);
}

如果您的 @Column 元素是公开的,则上面的代码会运行。如果它们是私有的,您需要为它们制作合适的 getter 和 setter 函数,您可以使用以下代码检索数据:

List<Gamers> w = SQLite.select()
                    .from(Gamers.class)
                    .where(Gamers_Table.name.eq("ali"))
                    .queryList();
for (int i=0;i<w.size();i++) {
    Log.d(TAG, ""+w.get(i).getName());
}

假设 getName() 是一个 getter 函数。您可以返回 List w 并使用更多。

于 2017-09-18T10:21:44.423 回答