是否有可能在运行时构造一个查询?
@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部分是可选的.也就是说,它应该能够在有或没有限制的情况下执行相同的查询.
在前一种情况下,可以使用和不使用限制部分进行两个静态查询,并且每次都可以使用适当的一个.但有时我们可能不得不处理更复杂的情况,例如构建过滤器.
在这种情况下,与前面的示例不同,将有多个可选部分.对于书籍表,我们可能需要根据书籍所属的类别,作者姓名,价格范围,出版日期等进行过滤.使用这些部分的所有组合进行静态查询几乎是不可能的.
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) …
当我尝试将 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)
我已经尝试过两者List和ArrayList,但没有运气。
提前致谢。
我刚刚开始与Room合作,虽然一切看起来都非常直观,但我目前还不清楚我究竟能如何处理关系.
由于SQLite是关系数据库,因此您可以指定对象之间的关系.尽管大多数ORM库允许实体对象相互引用,但Room明确禁止这样做.即使您不能使用直接关系,Room仍然允许您在实体之间定义外键约束.(来源:https://developer.android.com/topic/libraries/architecture/room.html#no-object-references)
按照设置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 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
我正在尝试使用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) 使用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 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时,这变得非常乏味......
我需要帮助我的考试项目找到ROOM数据库的差异和好处:我试图在android开发文档中搜索以了解这两个数据库之间的区别,但我无法清楚地理解.我也没有在堆栈溢出中找到任何答案.我还想知道使用Room持久性与SQLite数据库相比的好处.
希望有人能给我明确答案.
android ×10
android-room ×10
sqlite ×5
android-architecture-components ×2
database ×2
orm ×2
dao ×1
java ×1
kotlin ×1
sql ×1
transactions ×1