android - 我们如何在 Assets 文件夹中的sqlite中升级数据库

标签 android sqlite

我们如何在 Assets 文件夹中的sqlite中升级数据库

我正在尝试升级 Assets 文件夹中的数据库

使用 sqlite 管理器的 mozilla 插件我已经改变了两者

模式版本和用户版本

现在,当我尝试访问数据库时,它显示的是旧数据

onupgrade 到底应该做什么

这里是 dpbhelper 类

public class ExternalDbOpenHelper extends SQLiteOpenHelper {

    public static String DB_PATH;

    public static String DB_NAME;
    public SQLiteDatabase database;
    public final Context context;

    public SQLiteDatabase getDb() {
        return database;
    }

    public ExternalDbOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 1);
        this.context = context;

        String packageName = context.getPackageName();
        DB_PATH = String.format("//data//data//%s//databases//", packageName);
        DB_NAME = databaseName;
        openDataBase();
    }

    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        } else {
            Log.i(this.getClass().toString(), "Database already exists");
        }
    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }

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

    private void copyDataBase() throws IOException {
        InputStream externalDbStream = context.getAssets().open(DB_NAME);

        String outFileName = DB_PATH + DB_NAME;

        OutputStream localDbStream = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }

        localDbStream.close();
        externalDbStream.close();

    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }
        return database;
    }

    @Override
    public synchronized void close() {
        if (database != null) {
            database.close();
        }
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {



        Log.w(ExternalDbOpenHelper.class.getName(),
                "Upgrading database from version " + oldVersion  + " to "
                        + newVersion + ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS " + DB_NAME);
        onCreate(database);

    }
}

最佳答案

当 Assets 文件包含初始数据,而实际数据库可能包含用户输入的新数据时,您希望升级数据库而不删除新数据。 执行此操作的唯一方法是使用升级脚本。

如果数据库是只读的,你想删除旧的,只复制新的。最简单的方法是为新数据库指定一个不同的文件名。

关于android - 我们如何在 Assets 文件夹中的sqlite中升级数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35456646/

相关文章:

android - 如何在正确的 View 中从 fragment 中显示 Snackbar?

android - 短信正文在android中无法正确显示

java - 使用ViewFlipper以滑动 View 显示数据库中的图像

c# - 如何将 SQLite (SQLite.NET) 添加到我的 C# 项目中

java - 将值插入数据库

android - Android 中的 SVG 非缩放笔划之类的东西?

java - OnBootReceiver 可以工作,但找不到 AlarmReceiver

android - 用于构建 XML 服务器以在 Android 应用程序上显示的服务模块

android - 通过 Shared Preference 从 Sugar ORM 中检索数据

ios swift 4 本地数据库说明