【问题标题】:Room: Database calls retrieving null房间:数据库调用检索空
【发布时间】:2018-08-06 07:15:00
【问题描述】:

我试图从我的应用程序的许多不同区域调用我的数据库,但我无法保存和检索对象。当我检查我的数据时,看起来我正在获取正确列的光标,但它总是返回一个空对象,即使这些列中似乎有数据.

我不确定问题出在哪里,但它可能与我在变量资源管理器中找到的对数据库的递归调用有关(它继续这种级联直到我想探索)。

为了通过 Android Room 访问我的 SQLite 数据库,我使用了来自任何相关类的方法调用,如下所示(这会从各种唯一对象中多次调用[我应该关闭它吗?]):

@Entity(tableName = "cell")
public class LivingCell extends AsyncTask<Integer, Integer, Integer>{
    ....
    getCellsDB.getCell(uid);}

public CellsDBHandler getCellsDB(){
    if (cellsDBHandler == null)
        cellsDBHandler = CellsDBHandler.getAppDatabase(MainActivity.getContext(),uid);
        return cellsDBHandler;
}

现在我的印象是它不会创建数据库处理程序的新实例,因为这就是我的 CellsDBHandler 的样子:

@Database(entities = {LivingCell.class})
public abstract class CellsDBHandler  extends RoomDatabase {
    private static CellsDBHandler INSTANCE;
    public abstract CellDao cellDao();
    public static CellsDBHandler getAppDatabase(Context context, String cityUid) {
        if (INSTANCE == null) {
        INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                        CellsDBHandler.class,
                                        DBPath).build();}
        return INSTANCE;
}

    public LivingCell getCell(String cellUid) {
        return cellDao().getCellByID(cellUid);}
}

还有我的 CellDao

//ALL DAO CALLS ARE RETURNING NULL OBJECTS BUT HAVE POPULATED TABLES
@Dao 
public interface CellDao {
    @Query("SELECT * FROM cell")
    List<LivingCell> getAll();

    @Query("SELECT uid FROM cell")
    List<String> getAllUids();

    @Query("SELECT * FROM cell WHERE uid LIKE (:cellUid)")
    LivingCell getCellByID(String cellUid);


    @Insert(onConflict = REPLACE)
    void insert(LivingCell cell);
...

也许我对 MainActivity 的调用是问题所在……这是否是一种可以接受的查找应用程序上下文的方法?

private static MainActivity instance;
public static Context getContext(){
    return instance;
}

以防万一,我所有的 UID 都是:

//form of: 1c21df2a-5b8f-4a56-ac5b-ed385ba8e4b8
uid = UUID.randomUUID().toString();

【问题讨论】:

  • 对于上下文,您可以返回 this(在您的情况下为 instance),因为 Activity 扩展了上下文。
  • 我也发现了这一点,但不幸的是,这并没有解决正在检索的空对象。我会更新代码。
  • 基本的困境是所有对我的 CellDao() 的调用都返回一个空对象,即使它们包含数据。我的查询不好吗?
  • 您的查询中不应该是LivingCell吗?
  • 不是专家,但IN 是集合操作员?是否要检查是否相等?

标签: android recursion android-room


【解决方案1】:

由于cellUid 是单个字符串,而不是数组或集合,请尝试以下操作

@Query("SELECT * FROM cell WHERE uid LIKE :cellUid")

【讨论】:

  • 它读取 @Database(entities = {LivingCell.class})- 并且当每个查询返回 NULL 时,表名是有问题的。字符串可能需要分隔符。 LIKE \":cellUid\".
  • 不幸的是,这并没有做到这一点,正如之前的评论中所提到的,使用 @Query("SELECT * FROM cell")
  • @lostScriptie 那么表名是什么? (光标仍然不能保证窗口)。
  • LivingCell.class 是什么样的?
  • @MartinZeitler 想知道为什么没有抛出异常。我也怀疑表名,但不知道应该如何将 camelCase 转换为查询。
猜你喜欢
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
相关资源
最近更新 更多