标签: android-room

如何在运行时动态查询会议室数据库?

问题

是否有可能在运行时构造一个查询?


用例

@Query("SELECT * FROM playlist " +
        "WHERE playlist_title LIKE '% :playlistTitle %' " +
        "GROUP BY playlist_title " +
        "ORDER BY playlist_title " +
        "LIMIT :limit")
 List<IPlaylist> searchPlaylists(String playlistTitle, int limit);
Run Code Online (Sandbox Code Playgroud)

limit部分是可选的.也就是说,它应该能够在有或没有限制的情况下执行相同的查询.


一个更复杂的用例

在前一种情况下,可以使用和不使用限制部分进行两个静态查询,并且每次都可以使用适当的一个.但有时我们可能不得不处理更复杂的情况,例如构建过滤器.

在这种情况下,与前面的示例不同,将有多个可选部分.对于书籍表,我们可能需要根据书籍所属的类别,作者姓名,价格范围,出版日期等进行过滤.使用这些部分的所有组合进行静态查询几乎是不可能的.

android android-room

26
推荐指数
5
解决办法
2万
查看次数

Room Database Migration无法正确处理ALTER TABLE迁移

Java.lang.IllegalStateException

迁移没有正确处理用户(therealandroid.github.com.roomcore.java.User).

预期:

TableInfo {name ='user',columns = {name = Column {name ='name',type ='TEXT',notNull = false,primaryKeyPosition = 0},age = Column {name ='age',type ='INTEGER ',notNull = true,primaryKeyPosition = 0},id = Column {name ='id',type ='INTEGER',notNull = true,primaryKeyPosition = 1}},foreignKeys = []}找到:

发现

TableInfo {name ='user',columns = {name = Column {name ='name',type ='TEXT',notNull = false,primaryKeyPosition = 0},id = Column {name ='id',type ='INTEGER ',notNull = true,primaryKeyPosition = 1},age = Column {name ='age',type ='INTEGER',notNull = false,primaryKeyPosition = 0}},foreignKeys = []}

我正在尝试执行一个简单的迁移,我有一个被调用的类User,它有两列ID (primary key) …

sqlite android android-room

26
推荐指数
5
解决办法
1万
查看次数

协程流程:不确定如何将光标转换为该方法的返回类型

当我尝试将 Dao 更改为新的FlowApi 时,出现编译错误,指出

Not sure how to convert a Cursor to this method's return type
    public abstract kotlinx.coroutines.flow.Flow<java.util.List<com.ezek.ezign.model.ECampaign>> readCampaigns();
Run Code Online (Sandbox Code Playgroud)

道是

@Dao
interface CampaignDao {

    @Query("SELECT * FROM campaign ORDER BY timeStamp ASC")
    fun readCampaigns(): Flow<List<ECampaign>>

    @Query("SELECT * FROM campaign WHERE id = :campaignId")
    fun readCampaign(campaignId: Int): Flow<ECampaign>
}
Run Code Online (Sandbox Code Playgroud)

和依赖项是

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'

    implementation "android.arch.persistence.room:runtime:$rootProject.ext.room_version"
    kapt "android.arch.persistence.room:compiler:$rootProject.ext.room_version"

//room_version = "2.1.0"
Run Code Online (Sandbox Code Playgroud)

我已经尝试过两者ListArrayList,但没有运气。

提前致谢。

android kotlin android-room kotlin-coroutines

26
推荐指数
1
解决办法
3639
查看次数

Android会议室:如何建立关系模型?

我刚刚开始与Room合作,虽然一切看起来都非常直观,但我目前还不清楚我究竟能如何处理关系.

由于SQLite是关系数据库,因此您可以指定对象之间的关系.尽管大多数ORM库允许实体对象相互引用,但Room明确禁止这样做.即使您不能使用直接关系,Room仍然允许您在实体之间定义外键约束.(来源:https://developer.android.com/topic/libraries/architecture/room.html#no-object-references)

  1. 你应该如何模拟多对多一对多的关系?
  2. 这在实践中会是什么样子(示例DAO +实体)?

database sqlite orm android android-room

25
推荐指数
1
解决办法
2万
查看次数

调用Rooms inMemoryBuilder方法时,Room Persistence Library运行时异常

按照设置Room余辉库的教程时,我在Android设备上测试时遇到此错误.

java.lang.RuntimeException:找不到PackageName .AppDatabase的实现.AppDatabase_Impl不存在

我知道有一个类似的问题,但问题是由于kotlin gradle问题.可能重复

测试类:

@RunWith(AndroidJUnit4.class)
public class LocalDatabaseTest {

    private PhotoDao mPhotoDao;
    private AppDatabase mDb;

    @Before
    public void createDb() {
        Context context = InstrumentationRegistry.getTargetContext();
        mDb = Room.inMemoryDatabaseBuilder(context.getApplicationContext(), AppDatabase.class).build();
        mPhotoDao = mDb.photoDao();
    }

    @After
    public void closeDb() throws IOException {
    //mDb.close();
}

    @Test
    public void testPreConditions() {
        assertNotNull(mDb);
   }
Run Code Online (Sandbox Code Playgroud)

道:

    @Dao
    public interface PhotoDao {
    @Delete()
    public void delete(Photo... photos);

    @Update
    public void update(Photo ... photos);

    @Insert
    public void insert(Photo ... photos);
    }
Run Code Online (Sandbox Code Playgroud)

数据库:

@Database(entities = {Photo.class}, …
Run Code Online (Sandbox Code Playgroud)

java sqlite orm android android-room

25
推荐指数
3
解决办法
2万
查看次数

LiveData.getValue()在Room中返回null

Java POJO对象

public class Section {

    @ColumnInfo(name="section_id")
    public int mSectionId;

    @ColumnInfo(name="section_name")
    public String mSectionName;

    public int getSectionId() {
        return mSectionId;
    }

    public void setSectionId(int mSectionId) {
        this.mSectionId = mSectionId;
    }

    public String getSectionName() {
        return mSectionName;
    }

    public void setSectionName(String mSectionName) {
        this.mSectionName = mSectionName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的查询方法

@Query("SELECT * FROM section")
LiveData<List<Section>> getAllSections();
Run Code Online (Sandbox Code Playgroud)

访问数据库

final LiveData<List<Section>> sections = mDb.sectionDAO().getAllSections();
Run Code Online (Sandbox Code Playgroud)

在下一行,我正在检查sections.getValue()哪个总是给我null,虽然我在DataBase中有数据,后来我得到了onChanged()方法中的值.

sections.observe(this, new Observer<List<Section>>() {
    @Override
    public void onChanged(@Nullable List<Section> sections){

    }
});
Run Code Online (Sandbox Code Playgroud)

但是当我从查询中省略LiveData时,我正在按预期获取数据.查询方法:

@Query("SELECT * …
Run Code Online (Sandbox Code Playgroud)

android android-room android-livedata android-architecture-components

23
推荐指数
2
解决办法
2万
查看次数

Android Room SQLite_ERROR没有这样的表

我正在尝试使用Android Room,在完成本教程之后,当我尝试构建应用程序时,我收到以下错误:

Error:(23, 27) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: screen_items)

这个名字很好,应该存在.在进行更改后,我清理了项目并确保从设备中完全卸载了该项目.

在我用这条线Activity初始化东西onCreate:

db = AppDatabase.getDatabase(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

AppDatabase

@Database(entities = {PermitItem.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
  public static String DATABASE_NAME = "my_database";
  public final static String TABLE_ITEMS = "screen_items";

  private static AppDatabase INSTANCE;

  public abstract PermitItemDao permitItemModel();

  public static AppDatabase getDatabase(Context context) { …
Run Code Online (Sandbox Code Playgroud)

sqlite android dao android-room

23
推荐指数
4
解决办法
1万
查看次数

Android Room数据库事务

使用Android中的新房间数据库,我需要有两个顺序操作需要进行:

removeRows(ids);
insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我看到(在检查数据库时)有一些行丢失 - 我假设它们在插入后被删除.即 第一个操作与第二个操作并行运行.

如果我使用一个事务块,比如这个,那么一切都很好 - 第一个操作似乎在完成第二个之前完成:

roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();

insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

如果我在中间睡觉,那也没关系:

removeRows(ids);
Thread.sleep(500);

insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

Room似乎没有太多的文档,并且想知道我是否应该在完成顺序操作时使用上面的事务块,或者是否有更好的方法.

编辑:在@CommonsWare指出之后,@Query是异步的,@Insert而且@Delete是同步的.鉴于此,我如何获得删除行异步的查询:

@Query("DELETE from table WHERE id IN(:ids)")
int removeRows(List<Long> ids);
Run Code Online (Sandbox Code Playgroud)

根据我得到的构建输出Deletion methods must either return void or return int (the number of deleted rows),如果我尝试将返回类型包装在一个Flowable.

android transactions android-database android-room

22
推荐指数
3
解决办法
2万
查看次数

具有Android Room的可重用通用基类DAO

有没有办法用Android Room创建可重用的通用基类DAO?

public interface BaseDao<T> {

  @Insert
  void insert(T object);

  @Update
  void update(T object);

  @Query("SELECT * FROM #{T} WHERE id = :id")
  void findAll(int id);

  @Delete
  void delete(T object);

}

public interface FooDao extends BaseDao<FooObject> { ... }

public interface BarDao extends BaseDao<BarEntity> { ... }
Run Code Online (Sandbox Code Playgroud)

我无法找到任何方法来实现这一点,而无需声明相同的接口成员并为每个子类编写查询.在处理大量类似的DAO时,这变得非常乏味......

android android-room android-architecture-components

22
推荐指数
4
解决办法
6933
查看次数

SQlite数据库VS房间持久性库

我需要帮助我的考试项目找到ROOM数据库的差异和好处:我试图在android开发文档中搜索以了解这两个数据库之间的区别,但我无法清楚地理解.我也没有在堆栈溢出中找到任何答案.我还想知道使用Room持久性与SQLite数据库相比的好处.

希望有人能给我明确答案.

sql database sqlite android android-room

22
推荐指数
1
解决办法
1万
查看次数