【问题标题】:recreating database on onUpgrade Sqlite Android [duplicate]在onUpgrade Sqlite Android上重新创建数据库[重复]
【发布时间】:2016-11-30 10:03:18
【问题描述】:

我有一个已经发布的应用程序我没有在其中添加 DATABASE_VERSION

现在我想用我的 3 个表(~100 行)中的一些新行来更新数据库

我在升级时删除数据库并复制新的数据库文件。

我在资产中有数据库文件。但是在升级应用程序时它停止工作。 实际上 dubug 应用程序工作正常,但发布 apk 停止工作。

这是我的代码

private static String DB_PATH = "/data/data/my.package.name/databases/";

private static String DB_NAME = "file.sqlite";
private static final int DATABASE_VERSION = 2;

private SQLiteDatabase myDataBase;

private final Context myContext;
 *
 * @param context
 */
public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, DATABASE_VERSION);
    this.myContext = context;
}

/**
 * Creates a empty database on the system and rewrites it with your own database.
 */
public void createDataBase() {

    boolean dbExist = checkDataBase();

    if (dbExist) {
//do nothing - database already exist
    } else {

 //By calling this method and empty database will be created into the default system path
 //of your application so we are gonna be able to overwrite that database with our database.
        this.getReadableDatabase();

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }
    }

}

/**
 * Check if the database already exist to avoid re-copying the file each time you open the application.
 *
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    } catch (SQLiteException e) {

 //database does't exist yet.

    }

    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null;
}

/**
 * Copies your database from your local assets-folder to the just created empty database in the
 * system folder, from where it can be accessed and handled.
 * This is done by transfering bytestream.
 */
private void copyDataBase() throws IOException {

 //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

// Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

//Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

@Override
public synchronized void close() {

    if (myDataBase != null)
        myDataBase.close();

    super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    myContext.deleteDatabase(DB_NAME);
    Toast.makeText(myContext,"done",Toast.LENGTH_SHORT).show();
    createDataBase();
}

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    我相信这是你的问题:

    public void createDataBase() {
        ...
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
    

    this.getReadableDatabase() 打开您的数据库进行读取。然后,copyDataBase() 尝试编写您的 asset 文件。 但是,由于文件是为读取而打开的,因此您无法写入并出现错误。

    所以,我认为你必须更新 createDataBase() 如下:

    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (dbExist) {
            //do nothing - database already exist
        } else {
            SQLiteDatabase checkDB = getReadableDatabase();
            checkDB.close();
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }
    

    【讨论】:

    • 对不起。但不工作。谢谢你的回答
    【解决方案2】:

    如果您不关心旧数据库中的数据,则无需进行任何形式的升级或版本控制。 只需更改文件名。所以新 APK 会创建一个新文件,您可以随时删除旧文件。

    请注意SQLiteAssetHelper 可以帮助您进行复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多