标签: android-room

Room - Schema导出目录未提供给注释处理器,因此我们无法导出架构

我正在使用Android数据库组件室

我已经配置了所有内容,但是当我编译时,Android Studio会给我这个警告:

模式导出目录未提供给注释处理器,因此我们无法导出模式.您可以提供 room.schemaLocation注释处理器参数或将exportSchema设置为false.

据我所知,它是DB文件所在的位置

它怎么会影响我的应用程序?这里的最佳做法是什么?我应该使用默认位置(false值)吗?

java database android android-room

310
推荐指数
10
解决办法
8万
查看次数

房间坚持图书馆.删除所有

如何使用Room Persistence Library删除特定表上的所有条目?我需要删除表,但我无法找到任何信息如何执行此操作.

仅在数据库迁移或加载所有条目并删除它们时:)

android android-room android-architecture-components

156
推荐指数
6
解决办法
7万
查看次数

如何将主键作为Room Persistence lib的自动增量

我正在创建一个Entity(Room Persistence lib)类Food,我想把它foodId作为自动增量.

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}
Run Code Online (Sandbox Code Playgroud)

如何设置foodId自动增量字段?

android kotlin android-room

151
推荐指数
8
解决办法
7万
查看次数

原因:java.lang.Exception:找不到 os.name=Mac 和 os.arch=aarch64 的本机库。路径=/org/sqlite/native/Mac/aarch64

我正在使用Android Studio [Android Studio 北极狐 | 2020.3.1 补丁1]

My room library version is [2.3.0]
Used Gradle version [7.0.1]
Also added kapt 'org.xerial:sqlite-jdbc:3.36.0.1'


Caused by: java.lang.Exception: No native library is found for os.name=Mac and     os.arch=aarch64. path=/org/sqlite/native/Mac/aarch64 at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:333) at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:64) at androidx.room.verifier.DatabaseVerifier.<clinit>(DatabaseVerifier.kt:71)
Run Code Online (Sandbox Code Playgroud)

如何解决这个错误?

解决方案 使用 Room 版本:2.4.0-alpha03 或更高版本。

android jdbc android-room

151
推荐指数
5
解决办法
6万
查看次数

Android room persistent:AppDatabase_Impl不存在

我的app数据库类

@Database(entities = {Detail.class}, version = Constant.DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract FavoritesDao favoritesDao();

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();

                    //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gradle lib:

 compile "android.arch.persistence.room:runtime:+"   
 annotationProcessor "android.arch.persistence.room:compiler:+"
Run Code Online (Sandbox Code Playgroud)

当我要求例如它会给出这个错误时,我的应用程序类中不存在AppDatabase_Impl

public class APp extends Application {

    private boolean appRunning = false;

    @Override
    public void onCreate() {
        super.onCreate();
        AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does …
Run Code Online (Sandbox Code Playgroud)

java android android-room

105
推荐指数
13
解决办法
4万
查看次数

Android Room - 使用自动生成获取新插入行的ID

这是我使用Room Persistence Library将数据插入数据库的方法:

实体:

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}
Run Code Online (Sandbox Code Playgroud)

数据访问对象:

@Dao
public interface UserDao{
    @Insert(onConflict = IGNORE)
    void insertUser(User user);
    //...
}
Run Code Online (Sandbox Code Playgroud)

在上述方法本身完成插入后,是否可以返回User的id而无需编写单独的select查询?

android persistent-storage android-room

104
推荐指数
7
解决办法
5万
查看次数

Android Room - 简单选择查询 - 无法访问主线程上的数据库

我正在尝试使用Room Persistence Library的示例.我创建了一个实体:

@Entity
public class Agent {
    @PrimaryKey
    public String guid;
    public String name;
    public String email;
    public String password;
    public String phone;
    public String licence;
}
Run Code Online (Sandbox Code Playgroud)

创建了一个DAO类:

@Dao
public interface AgentDao {
    @Query("SELECT COUNT(*) FROM Agent where email = :email OR phone = :phone OR licence = :licence")
    int agentsCount(String email, String phone, String licence);

    @Insert
    void insertAgent(Agent agent);
}
Run Code Online (Sandbox Code Playgroud)

创建了Database类:

@Database(entities = {Agent.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract …
Run Code Online (Sandbox Code Playgroud)

crash android kotlin android-studio-3.0 android-room

94
推荐指数
15
解决办法
8万
查看次数

在android Room中更新实体的某些特定字段

我正在为我的新项目使用android房间持久性库.我想更新一些表的字段.我试过像我一样Dao-

// Method 1:

@Dao
public interface TourDao {
    @Update
    int updateTour(Tour tour);
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此方法进行更新时,它会更新实体中与tour对象的主键值匹配的每个字段.我用过@Query

// Method 2:

@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Run Code Online (Sandbox Code Playgroud)

它正在工作,但在我的案例中会有很多查询,因为我的实体中有很多字段.我想知道如何更新某些字段(不是全部),例如Method 1id = 1; (id是自动生成主键).

// Entity:

@Entity
public class Tour {
    @PrimaryKey(autoGenerate = true)
    public long id;
    private String startAddress;
    private String endAddress;
    //constructor, getter and setter
}
Run Code Online (Sandbox Code Playgroud)

android sql-update android-room

92
推荐指数
5
解决办法
7万
查看次数

如何从后台服务和更新UI更新ViewModel的LiveData

最近我正在探索谷歌最近推出的Android架构.从文档中我发现了这个:

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<Users>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // do async operation to fetch users
    }
}
Run Code Online (Sandbox Code Playgroud)

活动可以按如下方式访问此列表:

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在loadUsers()我正在异步获取数据的函数中,我将首先检查数据库(Room)中的数据,如果我没有得到数据,我将进行API调用以从Web服务器获取数据.然后我将获取的数据插入数据库(Room)并根据数据更新UI.建议的方法是什么?

如果我开始ServiceloadUsers()方法中调用API ,我该如何更新MutableLiveData<List<User>> users …

android background-service viewmodel android-room android-architecture-components

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

Android Room Persistence Library:Upsert

Android的Room持久性库慷慨地包含适用于对象或集合的@Insert和@Update注释.然而,我有一个用例(包含模型的推送通知)需要UPSERT,因为数据可能存在或可能不存在于数据库中.

Sqlite本身没有upsert,并且在这个SO问题中描述了变通方法.鉴于那里的解决方案,如何将它们应用于房间?

更具体地说,如何在Room中实现不会破坏任何外键约束的插入或更新?使用带onConflict = REPLACE的insert将导致onDelete调用该行的任何外键.在我的情况下,onDelete导致级联,重新插入行将导致其他表中的行与外键被删除.这不是预期的行为.

sqlite android android-room android-architecture-components

78
推荐指数
5
解决办法
4万
查看次数