【发布时间】: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