zoukankan      html  css  js  c++  java
  • Android的资料库更新遇到的问题

    在更新apk时如果有动到db的结构或者是里面预设值的话,在进行apk版本更新安装升级时,无法将现有db替换为新版中的db
    另外用户在使用apk时,会在db中写入一些数据,如果升级安装后通过在设定中清除资料的方式将现有db删除再导入的话,
    虽然可以导入新的db但是用户资料就会被删除。在使用时非常不变。
    程式在开始设计时没有考虑到用户会要修改db,遇到db有更新时,都是让用户通过清除资料的方式处理。
    db的导入使用复制assets中整个db的资料的方式,并非动态创建。

    解决方法:
    在onUpgrade中,将现有db中用户添加的内容备份,之后利用文件操作删除整个db文件,拷贝新版文件到db路径中,将之前备份的内容写入。
    在修改过程中遇到两个问题。
    1.onUpgrade中,无法进行select处理,提示数据表被锁。
    使用的是db.query和db.rawQuery方式,后来有看到资料说是由于db = this.getWritableDatabase();
    应该使用getReadableDatabase()。不知道是否可行。
    後來發現也可能是因为没有使用onUpgrade中的db对象,或者SDK的版本的问题???只是没有时间再试。。。。。
    于是想到一个很笨的方法,在onUpgrade中,只利用db.execSQL在现有db中添加一行。然后在程式启动时读db进行判断,
    如果有这一行的话,代表db有更新,然后进行相应处理。
    成功更新db。
    不过又遇到了第二个问题:
    2.如果新版本的db版本号大于旧版本的话,可以正常执行onUpgrade方法,
    不过如果在特殊情况下需要替换回旧版本的话,就会发生exception,
    android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
    后来爬文找到,原来在level 11的版本中就有提供一个onDownGrade的方法。于是换成的SDK 4.03,看到此方法。
    至此,问题全部解决,只是并不完美,等有时间的时候再来进行修改吧。

  • 相关阅读:
    【python】正则表达式
    Java 接口、抽象类
    设计模式之抽象工厂方法模式
    设计模式之工厂方法模式
    设计模式之单例模式
    pulltorefresh学习
    ProgressDialog使用
    android:descendantFocusability用法简析
    数据保存之File
    runOnUiThread学习
  • 原文地址:https://www.cnblogs.com/sipher/p/2857125.html
Copyright © 2011-2022 走看看