我需要帮助我的考试项目找到ROOM数据库的差异和好处:我试图在android开发文档中搜索以了解这两个数据库之间的区别,但我无法清楚地理解.我也没有在堆栈溢出中找到任何答案.我还想知道使用Room持久性与SQLite数据库相比的好处.
希望有人能给我明确答案.
我使用以下方法将 KSP 与 Room 结合使用:
plugins {
id 'com.google.devtools.ksp' version "$kotlin_version-1.0.0"
Run Code Online (Sandbox Code Playgroud)
dependencies {
ksp "androidx.room:room-compiler:$room_version"
Run Code Online (Sandbox Code Playgroud)
这确实有效。但是,当我尝试运行它时,我会收到此警告
[ksp] MyDatabase.kt:11:架构导出目录未提供给注释处理器,因此我们无法导出架构。您可以提供
room.schemaLocation注释处理器参数或将 exportSchema 设置为 false。
为了做到这一点:使用 KSP 时如何提供注释处理器参数?
我尝试在我的android kotlin项目中实现持久库,但在编译时捕获此错误:
错误:由于多个构造函数适合,Room无法选择构造函数.尝试使用@Ignore注释不需要的构造函数.
错误代码:
@Entity
data class Site(
var name: String = "",
var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0)
Run Code Online (Sandbox Code Playgroud) 我需要更新,如果不存在,则插入行到ROOM DB.
我这样做: productRepository.updateProducts(productsResponse.getProductItems());
和:
@Override
public void updateProducts(final List<ProductItem> products) {
new Thread(() -> {
for (ProductItem item : products) {
Product product = createProduct(item);
productDao.insert(product);
}
}).start();
}
Run Code Online (Sandbox Code Playgroud)
在DAO中:
@Insert
void insert(Product products);
Run Code Online (Sandbox Code Playgroud)
但我有方法
@Update
void update(Product product);
Run Code Online (Sandbox Code Playgroud)
我有一些问题:
两种方法都是无效的.插入后如何返回保存的Product或boolean flag或insert count?
如果我试着打电话update而且我没有排它会插入吗?
如何更新(如果不是 - 插入)行和返回计数updatet或插入的行?
我正在将所有支持/ appcompat库迁移到androidx.在所有更新之后,由于此错误,我无法构建我的项目
:app:processDebugManifest UP-TO-DATE
AGPBI: {"kind":"error","text":"error: resource android:attr/fontVariationSettings not found.","sources":[{"file":"/Users/xxx/.gradle/caches/transforms-1/files-1.1/appcompat-v7-27.1.1.aar/7cae290a69b05f5ffc25283e26a7eb4a/res/values/values.xml","position":{"startLine":250,"startColumn":4,"startOffset":27058,"endColumn":68,"endOffset":27122}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/ttcIndex not found.","sources":[{"file":"/Users/xxx/.gradle/caches/transforms-1/files-1.1/appcompat-v7-27.1.1.aar/7cae290a69b05f5ffc25283e26a7eb4a/res/values/values.xml","position":{"startLine":250,"startColumn":4,"startOffset":27058,"endColumn":68,"endOffset":27122}}],"original":"","tool":"AAPT"}
:app:processDebugResources
Run Code Online (Sandbox Code Playgroud)
我试图逐个包含所有依赖项,以确定导致问题的原因.只有当我删除Room库¯\ _(ツ)_ /¯时才能构建
https://developer.android.com/topic/libraries/architecture/adding-components#room
这很奇怪,因为问题似乎来自造型资源,但房间只是一个数据库库.
有没有人有任何想法或解决方案,包括房间而不打破一切?
===============================
我的conf:
compileSdkVersion 27
buildToolsVersion 27.0.3
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
}
dependencies {
// ROOM
implementation ('androidx.room:room-runtime:' + androidxRoomVersion)
implementation ('androidx.room:room-rxjava2:' + androidxRoomVersion)
implementation ('androidx.room:room-guava:' + androidxRoomVersion)
kapt ('androidx.room:room-compiler:' + androidxRoomVersion)
}
Run Code Online (Sandbox Code Playgroud)
with:androidxRoomVersion = 2.0.0-alpha1
android android-support-library android-gradle-plugin android-room androidx
在使用 Android Room 时我应该考虑哪些例外情况。从我的研究中,我发现只有一种例外情况可能发生。
这也是当你有Single<T>一个返回类型并且你有一个空的回报时。除此之外,我找不到任何其他可能引发异常的情况。
当然,如果你有一些逻辑上不正确的实现,可能会有一些例外,比如
MigrationOnConflictStrategy插入时不执行allowMainThreadQueries()我做了一些研究并尝试了几乎所有可能的情况,主要是 RxJava 返回类型,我看到了上面提到的一个异常,就是这样。
这是我运行的测试
我想确保我对每个可能的场景都有实现,并且没有一些异常和意外崩溃。我在想SQLite可能会发生异常的情况,但我相信它已经包裹在 Room 中并且会处理。(没有把握)
你能给出可能发生的任何其他可能的例外吗?
我不断收到此错误。我正在从事一个项目,在开发过程中,我决定迁移到AndroidX。
我收到以下错误:
Note: Failed to read get kotlin metadata for [Ljava.lang.Object;@79d6c4df
Run Code Online (Sandbox Code Playgroud)
在实体文件中存在相同的错误,在相应的DAO中也存在4个相同的错误。
这是DAO的代码:
@Dao
public interface FlockDao{
@Query("SELECT * FROM flock_table")
LiveData<List<Flock>> getAllFlocks();
@Query("SELECT * FROM flock_table WHERE fid IN (:flockIds) LIMIT 1")
Flock loadFlockById(int[] flockIds);
@Insert
void insert(Flock flock);
@Update
void update(Flock flock);
@Delete
void delete(Flock flock);
}
Run Code Online (Sandbox Code Playgroud)
我的实体是:
@Entity
public class Flock{
@PrimaryKey(autoGenerate = true)
private int fid;
@ColumnInfo(name = "user_id")
private int uid;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "capacity")
private int capacity;
@ColumnInfo(name = …Run Code Online (Sandbox Code Playgroud) 我正在使用Room作为应用程序的数据库.我有一个场景,其中Object某种类型需要存储在单独的表中.举个例子,让我们来Object看看Book.java
现在,我想要两个SQL表:
请忽略SQL DB的任何命名约定 - 这只是一个例子
问题
通常,人们只会@Entity(tableName = "Books_Read")在Book.java类中使用并拥有一个DAO将使用该表名的类.
事情是; 那么我怎么能够使用相同的Book.java类来存储在Books_To_Read表中?因为我已经定义@Entity(tableName = "Books_Read")为Book.java类的一部分,我看不到在哪里定义类的Books_To_Read表Book.java
我能够提出的唯一解决方案是创建一个新类 - 让我们称之为在类BookToRead.java 中扩展Book.java和定义@Entity(tableName = "Books_To_Read")的新类.
题
有没有更好的方法来做到这一点,或者这是处理它的预期方法?
我正在尝试实现房间数据库,我已经完成了官方网站上的步骤,“AppDatabase.java”文件如下:
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public static AppDatabase instance;
public static synchronized AppDatabase getInstance(Context context){
if (instance==null){
instance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "app_database").fallbackToDestructiveMigration().build();
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
以及我用于房间的依赖项:
// Room Database
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - RxJava2 support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我们的项目迁移到使用Room,顺便说一句,我觉得这是一个很棒的进步.
我有以下结构:
public class Entity extends BaseObservable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id", typeAffinity = ColumnInfo.INTEGER)
private long mId;
@ColumnInfo(name = "is_dirty")
@TypeConverters(BooleanTypeConverter.class)
private boolean mIsDirty;
// default constructor and accessors omitted for brevity
}
@Entity(tableName = "some_entities")
public class SomeEntity extends Entity {
@ColumnInfo(name = "type", typeAffinity = ColumnInfo.TEXT)
private String mType;
@ColumnInfo(name = "timestamp", typeAffinity = ColumnInfo.INTEGER)
private long mTimestamp;
// constructor, accessors
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译我的项目时,它失败并没有特定的错误.
如果我尝试使用扁平实体层次结构编译它,一切都很好.
所以,我的主要问题是:Room是否支持实体继承?它是否能够从父Entity类中获取列定义?
我还想知道扩展BaseObservable(我需要使数据绑定工作)是否会导致Room出现问题?BaseObservable有一个私有瞬态字段,所以这可能会导致代码生成的一些问题.
是否有任何推荐的模式来处理这个问题,或者我是否只需要压缩我的实体层次结构?
android-room ×10
android ×9
androidx ×2
database ×2
kotlin ×2
sql ×2
sqlite ×2
constructor ×1
java ×1
rx-java ×1