我正在使用Android数据库组件室
我已经配置了所有内容,但是当我编译时,Android Studio会给我这个警告:
模式导出目录未提供给注释处理器,因此我们无法导出模式.您可以提供
room.schemaLocation
注释处理器参数或将exportSchema设置为false.
据我所知,它是DB文件所在的位置
它怎么会影响我的应用程序?这里的最佳做法是什么?我应该使用默认位置(false
值)吗?
如何使用Room Persistence Library删除特定表上的所有条目?我需要删除表,但我无法找到任何信息如何执行此操作.
仅在数据库迁移或加载所有条目并删除它们时:)
我正在创建一个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 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 或更高版本。
我的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) 这是我使用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查询?
我正在尝试使用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) 我正在为我的新项目使用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 1
id = 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架构.从文档中我发现了这个:
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.建议的方法是什么?
如果我开始Service
从loadUsers()
方法中调用API ,我该如何更新MutableLiveData<List<User>> users …
android background-service viewmodel android-room android-architecture-components
Android的Room持久性库慷慨地包含适用于对象或集合的@Insert和@Update注释.然而,我有一个用例(包含模型的推送通知)需要UPSERT,因为数据可能存在或可能不存在于数据库中.
Sqlite本身没有upsert,并且在这个SO问题中描述了变通方法.鉴于那里的解决方案,如何将它们应用于房间?
更具体地说,如何在Room中实现不会破坏任何外键约束的插入或更新?使用带onConflict = REPLACE的insert将导致onDelete调用该行的任何外键.在我的情况下,onDelete导致级联,重新插入行将导致其他表中的行与外键被删除.这不是预期的行为.
android ×10
android-room ×10
android-architecture-components ×3
java ×2
kotlin ×2
crash ×1
database ×1
jdbc ×1
sql-update ×1
sqlite ×1
viewmodel ×1