标签: android-room

SQlite数据库VS房间持久性库

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

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

sql database sqlite android android-room

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

使用 Kotlin 信号处理 (KSP) 时提供注释处理器参数

我使用以下方法将 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 android-room kotlin-symbol-processing

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

由于多个构造函数是合适的错误,因此无法选择构造函数

我尝试在我的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)

android constructor kotlin android-components android-room

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

房间更新(或插入,如果不存在)行和返回计数更改行

我需要更新,如果不存在,则插入行到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)

我有一些问题:

  1. 两种方法都是无效的.插入后如何返回保存的Product或boolean flag或insert count?

  2. 如果我试着打电话update而且我没有排它会插入吗?

  3. 如何更新(如果不是 - 插入)行和返回计数updatet或插入的行?

android android-room

21
推荐指数
5
解决办法
3万
查看次数

Androidx模块,未找到android:attr/ttcIndex和android:attr/fontVariationSettings

我正在将所有支持/ 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

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

Android 房间例外

在使用 Android Room 时我应该考虑哪些例外情况。从我的研究中,我发现只有一种例外情况可能发生。

房间例外

这也是当你有Single<T>一个返回类型并且你有一个空的回报时。除此之外,我找不到任何其他可能引发异常的情况。

当然,如果你有一些逻辑上不正确的实现,可能会有一些例外,比如

  • 编辑方案,但未实施 Migration
  • OnConflictStrategy插入时不执行
  • 在主线程上运行房间,但不允许它 allowMainThreadQueries()

我做了一些研究并尝试了几乎所有可能的情况,主要是 RxJava 返回类型,我看到了上面提到的一个异常,就是这样。

是我运行的测试

我想确保我对每个可能的场景都有实现,并且没有一些异常和意外崩溃。我在想SQLite可能会发生异常的情况,但我相信它已经包裹在 Room 中并且会处理。(没有把握)

你能给出可能发生的任何其他可能的例外吗?

sqlite android reactive-programming rx-java android-room

21
推荐指数
1
解决办法
2561
查看次数

注意:无法读取[Ljava.lang.Object; @ 79d6c4df)的get kotlin元数据

我不断收到此错误。我正在从事一个项目,在开发过程中,我决定迁移到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)

android android-gradle-plugin android-room androidx

21
推荐指数
2
解决办法
5937
查看次数

Room数据库中具有相同类型对象的多个表

我正在使用Room作为应用程序的数据库.我有一个场景,其中Object某种类型需要存储在单独的表中.举个例子,让我们来Object看看Book.java

现在,我想要两个SQL表:

  • Books_Read
  • Books_To_Read

请忽略SQL DB的任何命名约定 - 这只是一个例子

问题

通常,人们只会@Entity(tableName = "Books_Read")Book.java类中使用并拥有一个DAO将使用该表名的类.

事情是; 那么我怎么能够使用相同的Book.java类来存储在Books_To_Read表中?因为我已经定义@Entity(tableName = "Books_Read")Book.java类的一部分,我看不到在哪里定义类的Books_To_ReadBook.java

我能够提出的唯一解决方案是创建一个新类 - 让我们称之为在类BookToRead.java 中扩展Book.java和定义@Entity(tableName = "Books_To_Read")的新类.

有没有更好的方法来做到这一点,或者这是处理它的预期方法?

sql database android database-design android-room

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

Android Studio:房间数据库实现上出现“尝试分配较弱的访问权限”错误

我正在尝试实现房间数据库,我已经完成了官方网站上的步骤,“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)

java android access-modifiers android-room

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

Room是否支持实体继承?

我正在尝试将我们的项目迁移到使用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

19
推荐指数
1
解决办法
6926
查看次数