首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Jetpack】使用 Room 中的 Migration 升级数据库异常处理 ( 多个数据库版本的迁移 | fallbackToDestructiveMigration() 函数处理升级异常 )

, 有可能安装的是 数据库 版本 1 / 版本 2 / 版本 3 任意一个版本的数据库 ; 数据库 版本 1 -> 数据库 版本 3 升级过程 : 如果用户之前运行的是数据库版本 1 , 那么运行该最新应用时...然后再 执行 val MIGRATION_2_3: Migration = object : Migration(2, 3) 迁移对象对应的迁移操作 , 从数据库版本 2 升级到 数据库版本 3 ; 数据库...版本 2 -> 数据库 版本 3 升级过程 : 如果之前用户手机中的数据库版本是 版本 2 , 那么 运行该最新应用时 , 直接执行 val MIGRATION_2_3: Migration = object...: Migration(2, 3) 迁移对象对应的迁移操作 , 从数据库版本 2 升级到 数据库版本 3 ; 三、数据库异常处理 - RoomDatabase.Builder#fallbackToDestructiveMigration...Observer#onChanged 回调, List: [] , 当前数据库是空的 , 之前的数据都被清空 , 此时打印的日志都是本次应用运行时新插入的数据 ; 四、完整代码示例

56620

Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)

* 调用时刻:当数据库第1次创建时调用 * 作用:创建数据库 表 & 初始化数据 * SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制 */...} /** * 复写onUpgrade() * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时) * 作用:更新数据库表结构...占位符; // 注:调用完upgrate()后,则会回调 数据库子类的onUpgrade() // 注:也可采用SQL语句修改 String...c.getColumnIndex(String columnName);//返回某列名对应的列索引值 c.getString(int columnIndex);...) 方法中的一个被调用时才会进行创建或者打开 } //数据库升级时调用 //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade

98420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

    的子类 DatabaseHelper.java //第一次创建数据库的时候回调该方法 //当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法...//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开 //...作用:更新数据库表结构 //调用时机:数据库版本发生变化的时候回调(取决于数据库版本) // 创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数 //该参数就是当前数据库版本...c.getColumnIndex(String columnName);//返回某列名对应的列索引值 c.getString(int columnIndex); //返回当前行指定列的值...) 方法中的一个被调用时才会进行创建或者打开 } //数据库升级时调用 //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade

    30.7K1611

    Android教程-保存数据-在SQL数据库中保存数据

    当你想要使用这个类来获取你的数据库的引用时,系统只会在需要时并且不会是应用启动时,执行创建和更新数据库的可耗时较长的操作....为了使用 SQLiteOpenHelper, 创建一个重载了 onCreate(), onUpgrade() 和 onOpen() 回调函数的子类....例如,这里是一个使用如下所示的一些命令的 SQLiteOpenHelper 实现 : public class FeedReaderDbHelper extends SQLiteOpenHelper...对于每一个获取方法,你必须传入你想要获取的列的索引位置 , 它可以通过调用 getColumnIndex() 或者 getColumnIndexOrThrow() 获取到...._ID) ); 从数据库中删除信息 ---- 要从数据库中删除行,你需要提供识别这些行的选择条件. 数据库API提供了创建能够防止数据库注入的选择条件的机制.

    1.8K30

    OpenGL ES for Android 相机预览

    () { super.onResume() glSurfaceView.onResume() } override fun onPause() {...弹出权限申请对话框,用户点击是否允许,不管是同意还是拒绝都会回调onRequestPermissionsResult方法,用户点击同意后打开camera,和已经有权限的操作是一样的。...setOnFrameAvailableListener的回调是从Activity中传入,真正的实现在Activity中, class CameraActivity : AppCompatActivity...相机权限申请的回调和Renderer中`onSurfaceCreated`(创建SurfaceTexture的方法)方法是异步的,也就是说无法知道这2个方法回调的前后顺序,因此需要保存相机权限状态cameraPermission...运行后发现相机的画面是倒的,这是因为camera本身输出的预览流就是倒的,下面通过矩阵旋转解决此问题,顶点shader修改如下: attribute vec4 a_Position; attribute

    1K20

    Kotlin入门(26)数据库ManagedSQLiteOpenHelper

    当然,Android为了方便开发者的工作,已经提供了一个操作SQLite的工具类即SQLiteOpenHelper,在App开发时可由SQLiteOpenHelper派生出具体的业务表管理类。...但是,系统自带的SQLiteOpenHelper有个先天缺陷,就是它并未封装数据库管理类SQLiteDatabase,这造成一个后果:开发者需要在操作表之前中手工打开数据库连接,然后在操作结束后手工关闭数据库连接...以上的种种问题都制约了SQLiteOpenHelper的安全性。...compile "org.jetbrains.anko:anko-sqlite:$anko_version" 现在有了用户信息表的管理类,在Activity代码中存取用户信息就方便多了,下面是往数据库存储用户信息和从数据库读取用户信息的代码片段...")             }         }     }          //从数据库读取用户信息     private fun readSQLite() {         val userArray

    1.1K10

    2014-10-27Android学习------SQLite数据库操作(二)-----数据库的创建--SQLiteHelper extends SQLiteOpenHelper

    上篇有篇文章讲了数据库的操作 条件是:数据库已经建好的了,我们只需要从里面获取数据(查询)就可以了, 现在我们来看看第二种数据库的操作: class SQLiteHelper extends SQLiteOpenHelper...封装一个继承SQLiteOpenHelper类的数据库操作类。...SQLiteOpenHelper类是一个抽象的辅助类,主要用来生成一个数据库并对数据库的版本进行管理,在SQLiteOpenHelper类的构造方法中分别传入Context、数据库名称,CursorFactory...子句,如果其值为null,将会使用默认的排序规则 limit:可选的limit子句,如果其值为null,将不会包含limit子句 3.关于游标Cursor学习: Android采用游标对从数据库中查询出来的结果进行随机的读写访问...,并建立新的数据表,并根据实际需求做其他的操作 public void onOpen(SQLiteDatabase db) 这是打开数据库时的回调函数,一般不会用到

    73720

    android下创建一个sqlite数据库

    Sqlite数据库是开源的c语言写的数据库,android和iphone都使用的这个,首先需要创建数据库,然后创建表和字段,android提供了一个api叫SQLiteOpenHelper数据库的打开和创建类...具体使用比如:创建一个class叫PersonSQLiteOpenHelper用户数据库类,继承SQLiteOpenHelper,父类是个抽象类要实现onCreate()和onUpgrate()方法,此时会报错要求创建构造方法...,构造方法的参数:Context上下文作用是告诉程序数据库创建在哪个目录下,String name数据库文件的名字,factory游标工厂一般我们都写null系统默认的,version数据库的版本从1开始...OnCreate(SQLiteDatabase db)方法是数据库第一次被创建时回掉,用来创建表以及初始化参数,参数就是我们创建的数据库。...PersonSQLiteOpenHelper(Context context) { super(context, "person.db", null, 1); } /** * 数据库第一次创建完成的回调

    67120

    安卓activity生命周期_请描述activity的生命周期

    典型情况下的生命周期。(官网的流程图肯定是要看的,一张图包含了一个Activity从创建到销毁所经历的一切) 先总结一下有什么生命周期回调方法以及各个生命周期回调方法都是代表什么意思。...调用时机:当用户按下HOME键时、长按HOME键,选择运行其他的程序时、按下电源按键(关闭屏幕显示)时、从activity A中启动一个新的activity时、屏幕方向切换时,例如从竖屏切换到横屏时。...您可以使用上述任一方法从Bundle 提取您保存的状态并恢复该 Activity 状态。...onStop之前,但是和onPause 的调用时序就不一定了,有可能在onPause之前或者之后。...Activity 的瞬态(UI 的状态)切勿使用它来存储持久性数据,而应使用onPause在用户离开 Activity 后存储持久性数据,例如应保存到数据库的数据。

    57410

    Android单元测试框架Robolectric3.0(二):数据篇

    文章目录 闲话单元测试 日志输出 网络请求篇 数据库篇 Love UT 1 闲话单元测试 我们经常讲“前人种树,后人乘凉”,然而在软件开发中,往往呈现出来的却是截然相反的景象,我们在绩效和指标的驱使下...的使用,这篇文章,主要介绍网络请求和数据库相关的功能如何测试。...2 日志输出 Robolectric对日志输出的支持其实非常简单,为什么把它单独列一个条目来讲解?因为往往我们在写UT的过程,其实也是在调试代码,而日志输出对于代码调试起到极大的作用。...4 数据库篇 Robolectric从2.2开始,就已经可以对真正的DB进行测试,从3.0开始测试DB变得更加便利,通过UT来调试DB简直不能更爽。...1.不使用任何框架的DB测试(SQLiteOpenHelper) 如果没有使用框架,采用Android的SQLiteOpenHelper对数据库进行操作,通常我们会封装好各个Dao,并实例化一个SQLiteOpenHelper

    1.3K20

    android开发之使用SQLite数据库存储

    Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。...SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。...onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。...SQLite 会自动为主键列创建索引。 通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的 schema,不需要删除表和索引 ....查询数据库 类似 INSERT, UPDATE, DELETE,有两种方法使用 SELECT 从 SQLite 数据库检索数据。

    2.6K20

    高效解决「SQLite」数据库并发访问安全问题,只这一篇就够了

    保证 SQLIiteHelper 在无人使用时才断开连接 关于这个问题的解决 stackoveflow 上很多人建议我们:永远不要断开 SQLiteHelper 的连接,但是这样以来你会在 logcat...上得到如下输出: Leak found Caused by: java.lang.IllegalStateException: SQLiteDatabase created and never closed...在这个方法中,我们有一个,用来记录数据库被“打开”了几次的 mOpenCounter 对象。当它等于 1 时,这意味着你需要去创建新的数据库连接来使用数据库,否则的话,就说明数据库已经在使用中了。...完美,最后: 现在你就能随心所欲的使用你的数据库,而且你可以相信 – 它是线程安全的了!...当然很多同学对数据库的使用,还有着很多的疑惑,我后期将会针对数据库的使用,作出一系列总结,有兴趣可以继续关注 _yuanhao 的编程世界 相关文章 ---- 每个人都要学的图片压缩终极奥义,有效解决

    2.8K21

    Android 优化——存储优化

    少用 cursor.getColumnIndex 根据性能调优过程中的观察 cursor.getColumnIndex 的时间消耗跟 cursor.getInt 相差无几。...SQLiteOpenHelper 维持一个单例 因为 SQLite 对多线程的支持并不是很完善,如果两个线程同时操作数据库,因为数据库被另一个线程占用, 这种情况下会报“Database is locked...索引 索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率。...分类 直接创建索引和间接创建索引 直接创建: 使用 sql 语句创建,Android 中可以在 SQLiteOpenHelper 的 onCreate 或是 onUpgrade 中直接 excuSql...在 ObjectOutputStream 上面再封装一个输出流 ByteArrayOutputStream 或 BufferedOutputStream,先将对象序列化后的信息写到缓存区中,然后再一次性地写到磁盘上

    1.2K20

    Android-Jetpack笔记-LiveData

    LiveData即有生命的数据,通过观察者模式实现,当数据发生变化时可以收到回调。同时还具备感知宿主生命周期的能力。...() { //设置数据 mLiveData.setValue("onResume"); } } 使用起来很简单,下面来看看是怎么实现的。...,回调 observer.mObserver.onChanged((T) mData); } 到这里,流程就已经走完了,值得注意的是,并不是所有生命周期都能观察到值的变化,试着在每个生命周期都...setValue一下,会发现只有onStart、onResume、onPause才会收到回调,这是因为, //LiveData.java private void considerNotify(ObserverWrapper...(有活跃边界),内部会调removeObserver observeForever:包装类是AlwaysActiveObserver (总是活跃),需要手动调removeObserver 优缺点 优点

    59120

    Pinterest:Android系统上的视频管理

    视频管理 从更高的层次上来看,我们需要构建一个组件,这个组件需要感知屏幕上所有可用的视频实例(即视图)以及其相关的surfaces(即视频片段)。...使用这些回调方法,我们尝试记录已提供有效视频URL的所有视频。这将为我们提供当前范围内可用的视频的初始列表。 在视频框架的第一个迭代中,我们依靠客户端代码本身调用这些调用,但是我们发现这是不可扩展的。...因为它在构建视频功能时增加了更多的复杂性。取而代之的方法是,我们通过构建需要传入基础视频组件的方法,提取了在VideoManager之后注册视频的回调方法。...同时这个方法还提供了基于在视频记录时传递的某些元数据属性动态更改之类其他功能的灵活性。 例如,我们可能希望所有视频广告都自动播放,但仅限于在同一片段上自动播放1个有机视频(即创作者生成的内容)。...())屏幕滚动组件或UI组件不在屏幕上(请参阅RecyclerView监听器) 屏幕上显示视频表面时的其他回调(即onResume()等) 为开发人员打造的内容 虽然我们希望减少开发人员面临的视频管理复杂性

    1.1K60

    Android入门教程 | Fragment 基础概念

    实际上,如果要将现有 Android 应用转换为使用片段,可能只需将代码从 Activity 的回调方法移入片段相应的回调方法中。...如要为片段提供布局,必须实现 onCreateView() 回调方法,Android 系统会在片段需要绘制其布局时调用该方法。此方法的实现所返回的 View 必须是片段布局的根视图。...通过 popBackStack()(模拟用户发出的返回命令)使片段从返回栈中弹出。 通过 addOnBackStackChangedListener() 注册侦听返回栈变化的侦听器。...然后,FragmentActivity 会自动通过 onBackPressed() 从返回栈检索片段。...此时左右两个 Fragment 都会执行从 onAttach->….->onResume 的生命周期,明明 Fragment 没有显示却已经到onResume 了,在某些情况下会出现问题。

    3.5K40

    【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    ,重建数据库表的索引,数据库升级,事物中保存点,没有返回值的语句; 参数介绍 :  -- 参数① sql: 要执行的SQL语句, 只能执行一条, 多条语句用分号隔开不管用, 参数使用 "?"...SQLiteOpenHelper类操作数据库 单独使用SQLiteDataBase操作数据库的弊端: 对数据库的表进行操作的时候, 我们不知道数据库中表是否存在, 首先要进行表操作, 在出现异常之后,...()方法即可; public SQLiteDatabase getWritableDatabase () (3) 创建数据库 创建数据库 : 第一次创建数据库的时候回调该方法, 一般在该方法中 创建数据库表...int oldVersion, int newVersion) 方法解析 :  -- 调用时机 : 数据库版本发生变化的时候回调, newVersion是当前数据库版本号, oldVersion是旧的版本号...从EditText组件中获取新闻的标题 和 新闻内容 * 2. 获取数据库并从将 新闻标题 和 内容 插入到数据库中 * 3. 重新查询数据库 获得Cursor对象 * 4.

    2.5K10
    领券