Android在apk更新的时候数据库改变的(只限于在数据库末尾添加新字段)

xiaoxiao2021-02-28  57

借鉴前辈的知识完善了一下关于Android在apk更新的时候数据库改变的(只限于在数据库末尾添加新字段)

@Override public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { // 函数在数据库需要升级时被调用, // 一般用来删除旧的数据库表, // 并将数据转移到新版本的数据库表中 /** * 要在方法里写for循环,主要是考虑到夸版本升级, 比如有的用户一直不升级版本,数据库版本号一直是1, * 而客户端最新版本其实对应的数据库版本已经是4了, 那么我中途可能对数据库做了很多修改,通过这个for循环,可以迭代升级,不会发生错误。 */ for (int j = oldVersion + 1; j <= newVersion; j++) { switch (j) { case 2: addColumn(_db, new String[] { SqlVisitBean.STARTTIME, SqlVisitBean.ENDTIME }, "DB_Visit_Info"); break; case 3: addColumn(_db, new String[] { "temp" }, "DB_Visit_Info"); break; default: break; } } } /** * 在表中添加字段方法 操作步骤: 1、先更改表名 2、创建新表,表名为原来的表名 3、复制数据 4、删除旧表 * * @param db * 数据库名 * @param newColumnArr * 添加的新字段的表名数组 * @param oldTableName * 旧表名,在方法内部将旧表名修改为 _temp_+oldTableName */ private void addColumn(SQLiteDatabase db, String[] newColumnArr, String oldTableName) { if (db == null || newColumnArr == null || newColumnArr.length < 1 || TextUtils.isEmpty(oldTableName)) { // 数据库为空,新字段个数为0,添加字段后的字段数组个数为0,旧表名为空 return; } // 拿到旧表中所有的数据 Cursor cursor = db.rawQuery("select * from " + oldTableName, null); if (cursor == null) { // 如果游标为空 return; } // 拿到原来的表中所有的字段名 String[] oldColumnNames = cursor.getColumnNames(); // 更改原表名为临时表 String tempTableName = "temp_" + oldTableName; db.execSQL("alter table " + oldTableName + " rename to " + tempTableName); // 创建新表 if (oldColumnNames.length < 1) { // 如果原来的表中字段个数为0 return; } // 创建一个线程安全的字符串缓冲对象,防止用conn多线程访问数据库时造成线程安全问题 StringBuffer createNewTableStr = new StringBuffer(); createNewTableStr.append("create table if not exists " + oldTableName + "("); for (int i = 0; i < oldColumnNames.length; i++) { if (i == 0) { createNewTableStr.append(oldColumnNames[i] + " integer primary key autoincrement,"); } else { createNewTableStr.append(oldColumnNames[i] + ","); } } for (int i = 0; i < newColumnArr.length; i++) { if (i == newColumnArr.length - 1) { // 最后一个 createNewTableStr.append(newColumnArr[i] + ")"); } else { // 不是最后一个 createNewTableStr.append(newColumnArr[i] + ","); } } db.execSQL(createNewTableStr.toString()); // 复制旧表数据到新表 StringBuffer copySQLStr = new StringBuffer(); copySQLStr.append("insert into " + oldTableName + " select *,"); // 有多少个新的字段,就要预留多少个' '空值给新字段 for (int i = 0; i < newColumnArr.length; i++) { if (i == newColumnArr.length - 1) { // 最后一个 copySQLStr.append("' ' from " + tempTableName); } else { // 不是最后一个 copySQLStr.append("' ',"); } } db.execSQL(copySQLStr.toString()); // 删除旧表 db.execSQL("drop table if exists " + tempTableName); // 关闭游标 cursor.close(); }

暂时就是这些 感谢http://blog.csdn.net/sunnyjerry/article/details/54091345

转载请注明原文地址: https://www.6miu.com/read-54601.html

最新回复(0)