天道酬勤,学无止境

Does RoomDB supports dropAllTables() and createAllTables()?

GreenDAO supports DaoMaster.dropAllTables() and DaoMaster.createAllTables(). I'm looking for similar functionality in RoomDB. Does RoomDB supports this functionality ??

The use-case for this functionality is, when the user tries to login with new mobile number to my app, i want to clear the data of old login number by showing a warning dialog message and allow login with new number.

评论

Room supports dropping and creating tables only during a migration between schema versions.

You can gain access to the underlying SupportSQLiteDatabase via RoomDatabase.getOpenHelper().getReadableDatabase(). With that, you can use execSQL() to execute SQL statements, include table dropping and creating.

But doing so is not consistent with the intended use of Room and is not safe. It will very likely break the InvalidationTracker used to notify observers of changes to managed tables.

From your use-case, it seems like rather than dropping and recreating the tables, all you need to do is clear them by deleting all entries.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • GreenDAO模式更新和数据迁移?(GreenDAO schema update and data migration?)
    问题 我正在评估GreenDAO,以便在我将要研究的商业Android应用程序中进行考虑,并希望确定架构更新的迁移路径。 我断言必须写一个提供onUpdate()并根据新模式提取转换并存储数据的自定义OpenHelper正确吗? 该假设引发了一些有关呼叫排序和责任划分的有趣问题。 我找不到有关GreenDAO的架构更新和数据迁移的任何文档。 这是我写过的许多关于此主题的博客文章: greenDAO的评论第1部分–模式生成第2部分–模式迁移第3部分–测试架构迁移 回答1 您假设正确。 如今,不同架构版本之间没有更改跟踪。 因此,在升级架构时,您需要自己编写SQL。 回答2 考虑到pleonasmik的方法(顺便说一句,谢谢,它确实很有帮助),我创建了一个MigrationHelper类。 这个怎么运作: 班上所有你得到的道教根据旧版本的方案创建临时表( generateTempTables方法) 将所有数据导入到此新表中( generateTempTables方法) 删除旧版本的所有表( DaoMaster.dropAllTables方法) 创建新版本的表( DaoMaster.createAllTables方法) 从临时表更新新版本的表( restoreData方法) 删除所有临时表( restoreData方法) 迁移助手类: import android.database
  • 如何清理/删除greenDao数据库(How to clean/delete greenDao database)
    问题 目前我是这样做的: DaoMaster.dropAllTables(getDb(), true); DaoMaster.createAllTables(getDb(), true); 但是,当我尝试将实体添加到数据库时,我收到崩溃日志,说该表不存在 Edit1:我知道这是因为数据库被锁定并且尚未创建表。 所以我把这个问题归结为问题——如何知道表是否被锁定在 grrenDao/Sqlite 中? 回答1 到目前为止,我不担心表是否被锁定; 就我而言,我执行以下操作并且它有效: 首先,当 App.onCreate 执行时,我进行标准初始化。 T.devOpenHelper= new DaoMaster.DevOpenHelper(context, "mydatabase", null); T.sqLiteDatabase= T.devOpenHelper.getWritableDatabase(); T.daoMaster= new DaoMaster(T.sqLiteDatabase); T.daoSession= T.daoMaster.newSession(); T.dao_myEntity= T.daoSession.getMyEntityDao(); 在未来的某个时刻,我删除并重新创建所有表,就像您一样: T.daoMaster.dropAllTables(T
  • How to clean/delete greenDao database
    Currently I'm doing it like this: DaoMaster.dropAllTables(getDb(), true); DaoMaster.createAllTables(getDb(), true); but then, when I'm trying to add entity to the database, I'm getting crash log saying that this table isn't exist Edit1: I know that it happens because the db is locked and tables wasn't created yet. So I'm reducing this problem to the problem - how to know if the tables are locked in grrenDao/Sqlite?
  • greenDao架构升级(greenDao Schema Upgrade)
    问题 我已经看到了另一个有关使用“绿岛”进行架构升级/迁移的问题(此处) 答案中有很多链接,它们是在进行模式升级时可以使用的良好模式的方法-但是,没有任何示例说明了您对数据进行实际操作以正确迁移数据的过程,而我在寻找任何内容时都遇到了麻烦。 就我而言,我的迁移非常简单-我不希望转换任何现有数据,我只需要向架构中添加一些新表,我怀疑这是相当普遍的情况。 在不删除用户已经保存的数据的情况下,将新表添加到架构的最简单方法是什么? 一个具体的例子将不胜感激。 如果greenDao提供了一个类似于DevOpenHelper的类,那将非常棒,该类将仅添加架构中以前不存在的新表/列,而无需先删除现有的表/数据。 回答1 我终于有时间自己研究这个问题,并且意识到在保留旧表中的数据的同时添加新表非常容易。 免责声明:虽然我意识到此实现是针对我的情况的,但我认为这对像我这样专门使用Android ORM工具(greenDao)处理Android上的SQLite的人很有帮助。 我知道这对于从一开始就编写自己的表创建查询的人来说是很普遍的,但是对于那些对将SQLite DB与Android结合使用感到胆怯的人来说,我认为这个示例将有所帮助。 解答:您可以修改DevOpenHelper内部类,也可以创建自己的类。 我选择暂时编辑DevOpenHelper以使示例保持简单-但是,请注意
  • MySQL 在脚本中包含一个脚本(MySQL Include a script within script)
    问题 我参与了一个将项目从 Oracle 迁移到 MySQL 的项目。 在 Oracle 中,当批处理通过命令行运行时,我能够创建引用或包含其他外部 SQL 脚本文件的 SQL 脚本。 我有一个名为 CreateAllTables.sql 的脚本,内部看起来像这样: @tables\Site.sql @tables\Language.sql @tables\Country.sql @tables\Locale.sql @tables\Tag.sql 我已经知道 MySQL 命令行“Source”命令,但我的目标是通过一个命令行调用调用一个包含其他脚本的主 .sql 脚本文件,如下所示: mysql --user=root --password --database=junkdb -vv < CreateAllTables.sql 所以我的问题是如何用 MySQL 做到这一点? 回答1 source对我有用。 # -- foo.sql DROP TABLE foo; source bar.sql # -- bar.sql CREATE TABLE bar (i INT NOT NULL); $ mysql ... < foo.sql 现在表foo消失了,并且创建了bar 。 回答2 请注意,上面的“源”选项仅在脚本通过支持它的 mysql 客户端运行时才有效(对我而言)。 (在 OP
  • Phonegap离线数据库(Phonegap Offline Database)
    问题 我想在用户电话(大于100 MB)中的加密数据库中存储一些大型脱机数据。 如果可能的话,我也想分发预先填充的数据库。 我也看到了。 我知道有关Web数据库的内容,但是由于它已贬值,因此建议不要使用它。 我还看到了一些第三方插件,例如SQLite插件,但它仅适用于iOS和Android设备,但我的目标是4个平台(ios,android,blackberry,windows) 除了写下我自己的解决方案之外,还有其他解决方案吗? 回答1 我最近制作了一个需要此程序的应用程序,目标是相同的操作系统。 您可以使用2个数据库的组合: 1. LocalStorage :: 检查本地存储 function supports_html5_storage() { try { return 'localStorage' in window && window['localStorage'] !== null; } catch (e) { return false; } } 将项目设置到LocalStorage localStorage.setItem("bar", foo); 或者 localStorage["bar"] = foo; 从LocalStorage获取项目 var foo = localStorage.getItem("bar"); 或者 var foo = localStorage
  • Android 房间持久化:AppDatabase_Impl 不存在(Android room persistent: AppDatabase_Impl does not exist)
    问题 我的应用程序数据库类 @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
  • Android Room 数据库事务(Android Room database transactions)
    问题 使用 Android 中的新房间数据库,我有一个要求,需要进行两个顺序操作: removeRows(ids); insertRows(ids); 如果我运行它,我会看到(在检查数据库时)缺少一些行 - 我假设它们在插入后被删除。 即。 第一个操作与第二个操作并行运行。 如果我使用事务块,例如这样,那么一切都很好 - 第一个操作似乎在执行第二个操作之前完成: roomDb.beginTransaction(); removeRows(ids); roomDb.endTransaction(); insertRows(ids); 如果我在中间睡一觉也没关系: removeRows(ids); Thread.sleep(500); insertRows(ids); Room 似乎没有太多文档,我想知道当我要完成顺序操作时是否应该使用上面的事务块,或者有没有更好的方法来做到这一点。 编辑:@CommonsWare 指出后, @Query是异步的,而@Insert和@Delete是同步的。 鉴于此,我将如何获得删除行以进行异步的查询: @Query("DELETE from table WHERE id IN(:ids)") int removeRows(List<Long> ids); 根据构建输出,如果我尝试将返回类型包装在Flowable ,则Deletion methods
  • MySQL Include a script within script
    I'm involved is a project to migrate a project from Oracle to MySQL. In Oracle I have the ability to create a SQL script that references or inlcudes other external SQL script files when the batch is run via command line. I Have a script called CreateAllTables.sql that looks like this internally: @tables\Site.sql @tables\Language.sql @tables\Country.sql @tables\Locale.sql @tables\Tag.sql I'm already aware of the MySQL command line "Source" command, but my goal is to invoke a single main .sql script file that includes other scripts via one single command line call like this: mysql --user=root -
  • Android Room database transactions
    With the new Room Database in Android, I have a requirement where there are two sequential operations that needs to be made: removeRows(ids); insertRows(ids); If I run this, I see (on examining the db) that there are some rows missing - I assume they are being deleted after inserting. viz. the first operation is running in parallel to the second. If I use a transaction block, such as this, then it's all fine - the first operation seems to complete before doing the second: roomDb.beginTransaction(); removeRows(ids); roomDb.endTransaction(); insertRows(ids); It's also fine if I give a sleep in
  • 如果只添加新表,房间数据库迁移(Room database migration if only new table is added)
    问题 让我们假设,我有一个简单的 Room 数据库: @Database(entities = {User.class}, version = 1) abstract class AppDatabase extends RoomDatabase { public abstract Dao getDao(); } 现在,我要添加一个新实体: Pet和碰撞版本到 2: @Database(entities = {User.class, Pet.class}, version = 2) abstract class AppDatabase extends RoomDatabase { public abstract Dao getDao(); } 当然,Room 会抛出异常: java.lang.IllegalStateException: A migration from 1 to 2 is necessary. 假设我没有更改User类(所以所有数据都是安全的),我必须提供只创建一个新表的迁移。 因此,我正在研究 Room 生成的类,搜索生成的查询以创建我的新表,将其复制并粘贴到迁移中: final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull final
  • Android 开发者学习路线(2020 版本)
    原文: https://www.androidperformance.com/2020/02/03/android-development-learning-path-2020-edition/#Android-Jetpack 仅作为个人学习目标。 目录 Programming Java Kotlin Flutter Android Studio Android Studio IDE Overview Project Structure — Java/Kotlin/Flutter, XML, .gradle files Android 基础知识 四大组件 Intents Static User Interface Dynamic User Interface CustomView UI Resources Fragments Support User Interface Storage Build Threading Debugging Memory Leak 3rd Party Library Data Format Android Jetpack Architecture Unit Testing Firebase Security App Release Programming Java Java 是 Android App 开发默认的语言, Android
  • Android Room - simple select query - Cannot access database on the main thread
    I am trying a sample with Room Persistence Library. I created an Entity: @Entity public class Agent { @PrimaryKey public String guid; public String name; public String email; public String password; public String phone; public String licence; } Created a DAO class: @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); } Created the Database class: @Database(entities = {Agent.class}, version = 1) public abstract class
  • 分页编译问题:不确定如何将 Cursor 转换为该方法的返回类型(Paging Compile Issue : Not sure how to convert a Cursor to this method's return type)
    问题 我一直在尝试使用谷歌在 Android 架构组件中提供的 Room 实现分页库。但是它在我的UserDao类中显示编译时错误 这是错误: Error:(22, 42) error: Not sure how to convert a Cursor to this method's return type 我的问题是什么返回类型? 用户道 @Dao public interface UserDao { @Query("SELECT * FROM user") LiveData<List<User>> getAll(); //Compile Error is here : Not sure how to convert a Cursor to this method's return type @Query("SELECT * FROM user") LivePagedListProvider<Integer, User> userByPagination(); } 这里是UserModel.java public class UserModel extends AndroidViewModel { private final UserDao userDao; public UserModel(Application application) { super
  • Android 开发者学习路线(2020 版)
    原文作者:Gracker 原文链接:https://androidperformance.com/2020/02/03/android-development-learning-path-2020-edition/ 发表日期:February 3rd 2020, 12:06:25 am 更新日期:February 3rd 2020, 4:55:46 pm Medium 上 @MindOrks 发布了一篇 2020 年 Android 程序员的学习线路,鉴于一部分人看不到,我把这篇文章的内容结合自己的 2020 年的学习计划,一起发出来,给大家一个参考 原文比较简单,并没有介绍为什么要推荐这些,只是单纯地列了一下知识点,我这边针对每个知识点做一些简单的介绍,有些知识点原文并没有提到,我会根据自己的理解加上,仅供参考 这篇文章主要针对 Android 开发者,如果你是新手,那么下面的内容可以帮助你找到学习的线路;如果你是老手,下面的 List 也可以帮助你查漏补缺。如果各位有什么其他的建议,欢迎留言交流 Programming Java Java 是 Android App 开发默认的语言, Android Framework 也是默认使用 Java 语言,熟练掌握 Java 语言是 Android 开发者的必备技能。 希望深入 Java 虚拟机的同学,也可以参考下面两本书: 周志明的
  • Visual Studio inserts invalid characters in batch files
    I've got some batch files that I use to help automate the process of creating and reloading development databases. It makes sense to create and maintain these batch files in Visual Studio (i.e., in a VS Database project). They look pretty simple, like this: @echo off echo Setting server and db from defaults. set SERVERNAME=(LOCAL) set DB=PLEDGES echo Creating tables on server %SERVERNAME% and database %DB% sqlcmd -S %SERVERNAME% -d %DB% -E -i DropAllTables.sql sqlcmd -S %SERVERNAME% -d %DB% -E -i dbo.UserType.Table.sql sqlcmd -S %SERVERNAME% -d %DB% -E -i dbo.RegisteredUser.Table.sql echo Done
  • Android:NoClassDefFoundError 仅在发布版本中(Android: NoClassDefFoundError only on release build)
    问题 我在Android Studio并尝试在发布模式下构建我的项目。 在调试模式下一切正常,但在发布模式下出现以下错误...... 08-26 17:59:05.599 31696-31931/? W/System.err﹕ java.lang.NoClassDefFoundError: a.a.b.l 08-26 17:59:05.599 31696-31931/? W/System.err﹕ at java.lang.Class.classForName(Native Method) 08-26 17:59:05.599 31696-31931/? W/System.err﹕ at java.lang.Class.forName(Class.java:308) 08-26 17:59:05.599 31696-31931/? W/System.err﹕ at java.lang.Class.forName(Class.java:272) 08-26 17:59:05.599 31696-31931/? W/System.err﹕ at com.a.a.a.a(Unknown Source) 08-26 17:59:05.599 31696-31931/? W/System.err﹕ at com.a.a.a.a(Unknown Source) 08-26 17:59:05
  • Android - 绿道多重交易(Android - Green Dao Multiple Transaction)
    问题 我在 greendao 示例中遇到多个事务的一些问题,我已经有两个带有 name book 和 type_book 的表。 我已经有这样的代码: SQLiteDatabase db = bookMasterDao.getDatabase(); db.beginTransaction(); try { bookMasterDao.insert(bookMaster); idBook = bookMaster.getId().intValue(); db.setTransactionSuccessful(); } catch (Exception ex) { System.out.println("Error insert book master " + ex); } finally { db.endTransaction(); } SQLiteDatabase dbTypeBook = typeBookMasterDao.getDatabase(); dbTypeBook.beginTransaction(); try { typeBookMasterDao.insert(bookMaster); dbTypeBook.setTransactionSuccessful(); } catch (Exception ex) { System.out.println("Error
  • Paging Compile Issue : Not sure how to convert a Cursor to this method's return type
    I have been try to implemented the Paging Library with Room provided by google in Android Architecture Component.But its showing compile time error in my UserDao Class Here is the Error: Error:(22, 42) error: Not sure how to convert a Cursor to this method's return type My Question is what return Type ? UserDao.java @Dao public interface UserDao { @Query("SELECT * FROM user") LiveData<List<User>> getAll(); //Compile Error is here : Not sure how to convert a Cursor to this method's return type @Query("SELECT * FROM user") LivePagedListProvider<Integer, User> userByPagination(); } Here the
  • Android Room-简单选择查询-无法访问主线程上的数据库(Android Room - simple select query - Cannot access database on the main thread)
    问题 我正在使用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; } 创建了一个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); } 创建了数据库类: @Database(entities = {Agent.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract