2014-11-02 61 views
4

我想创建一个脱机字典应用程序,有时需要获取更新,旧数据库将被替换为新数据库。这就是我想要做的,我做了这样的事情与SQLiteAssetHelper库:Android SQLiteAssetHelper无法将只读数据库从版本1升级到2:

注:SQLiteAssetHelper将资产复制数据库文件夹到应用程序数据文件夹

public class MyDb extends SQLiteAssetHelper { 
    private static final String DATABASE_NAME = "db.sqlite"; 
    private static final int DATABASE_VERSION = 1; 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

现在我想更新数据库, puting新db.sqlite文件到文件夹assets后,我有操纵这样我的代码:

public class MyDb extends SQLiteAssetHelper { 
    private static final String DATABASE_NAME = "db.sqlite"; 
    private static final int DATABASE_VERSION = 2; 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

,但是当我编译和运行它说:无法将只读数据库从版本1升级到2

解决方案是什么?

通过清除应用程序的数据,它会工作得很好......

对不起,我的英语不好......

+0

你能提供'''SQLiteAssetHelper'''的代码吗? – 2014-11-02 19:15:31

+0

它在这里https://github.com/jgilfelt/android-sqlite-asset-helper – Omid 2014-11-02 19:16:02

+0

试试这个链接http://stackoverflow.com/questions/14287191/android-cant-upgrade-read-only-database-from-版本0到1 – Jickson 2014-11-02 19:16:18

回答

6

报价the documentation

如果你有一个只读数据库或不关心用户数据丢失,每次通过调用SQLiteAsstHelper子类构造中的setForcedUpgrade()方法来增加版本号(使用资产中的本地数据库覆盖本地数据库)时,您可以强制用户使用最新版本的SQLite数据库要么。

您还可以传递参数,该参数是强制升级的版本号。

请注意,这将覆盖现有的本地数据库及其中的所有数据。

您没有从构造函数中调用setForcedUpgrade()

+0

仍然无法使用setForcedUpgrade(); – Omid 2014-11-02 19:44:10

+0

@Omid:重新安装您的数据库版本1应用程序并重试,以防过去的尝试损坏您的文件。除此之外,请考虑在您的问题中发布整个堆栈跟踪。 – CommonsWare 2014-11-02 19:46:06

+0

仍然无法正常工作 – Omid 2014-11-02 19:55:24

1

它是由这个解决:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion != newVersion) { 
     context.deleteDatabase(DATABASE_NAME); 
     new MyDb(context); 
    }else 
     super.onUpgrade(db, oldVersion, newVersion); 
    } 

这对于一些数据库得到更新时,我们不需要的旧数据非常有用。

1

请注意删除旧数据库并在onUpgrade中创建新数据库不是正确的解决方案。旧数据必须迁移。如果您对维护较旧的数据ov版本1不感兴趣,那就没问题。

正确的方法是使用onUpgrade修改架构。大部分时间改变模式都需要重新创建表格。在这种情况下,按照以下方法

  1. 重命名现有的表(说table_xyz)进行修改,以一些临时 名(说temp_table_xyz)
  2. 创建新架构表(table_xyz)
  3. 从复制的内容临时表temp_table_xyz到 新table_xyz
+0

我的数据并不重要,这是一本字典,有时候我们改变db中的拼写错误。所以旧的db必须删除我想 – Omid 2014-11-03 15:06:49

6

构造后,你应该叫setForcedUpgrade();

public class MyDb extends SQLiteAssetHelper { 

    private static final int DATABASE_VERSION = 2;//+1 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    setForcedUpgrade(); 
    } 
}