场景
我现在需要修改数据库中的数据,不止一个数据库,而是整个项目中的所有数据库,对我们的数据库其他应用可以访问,哈哈哈哈。对于为什么要这个么干,我不想吐槽,因为不得不这么干。大概有10个数据库,采用注解式数据库方案,扩展性不好,我只能使用sqlite,我只需要知道数据库,表名字以及列名,我就可以写一份代码到处执行,全部搞定。
我这里所干的事情是修改里面的数据,修改里面的数据,修改里面的数据,重要的事情说三遍,我想都不想就写个类继承SQLiteOpenHelper,然后获取数据库对象,通过update进行更新数据,完事了,对,我也是这么干的,但是我遇到一个问题,就是每次修改完后,修改的数据库被删除了,what,什么鬼,到底是哪里处理问题。
我的解决思路
1.我第一感觉,是不是代码有问题,作为一个程序员我是多么自觉,我采用了两种方法来实现,来排除代码的问题。如下:
方法1:
SQLiteDatabase db = sqLiteDatabase;
ContentValues values = new ContentValues();
values.put(column, newUserId);
String selection = column + " LIKE ?";
String[] selectionArgs = {oldUserId};
int count = db.update(tableName, values, selection, selectionArgs);
方法二:
String sql = "update " + tableName + " set " + column + "=" + newUserId + " where " + column + " = " + oldUserId;
db.execSQL(sql);
db.close();
仍然有同样的问题,于似乎我找了老司机,搞数据库的服务端,让他们帮我看看我update有没有问题,他们说没有问题,这下我放心了,开始找找其他原因。
2.我想是不是其他应用干的坏事,发现数据不一致个删除数据库的,我内心其实知道他们肯定不会这么干。我找呀找,我没有找到删除数据库代码。找了几个相关的应用,花了半天时间仍然无果,排除了其他应用导致的,只好放弃,想想有没可能是其他问题。
3.开始着手找创建数据库代码地方,看了下,只有在升级或者降级数据库的时候,会把数据库给删除,再也没有其他地方可以删除数据库。所以我想可能是数据库被升级了,或者被降级了,导致数据库被删除并重建了。
我开始着手我写的代码,发现我把数据库的版本设置的为Integer.MAX_VALUE,从正常的逻辑来看,更新数据是不会升级或者降级数据库版本,但是我在实现update的方式有点问题,采用的是继承SQLiteOpenHelper方式,使用这种方式是创建数据库的,会导致数据库的版本升级的。既然找到问题所在,又不确定是不是,先改代码,我需要的不是创建数据库,而是打开数据库,急忙去看看SqliteDatabase api 里面果然有打开数据库的函数,代码如下:
try {
sqLiteDatabase = SQLiteDatabase.openDatabase(dataBase, null,SQLiteDatabase.OPEN_READWRITE);
} catch (Exception e) {
e.getMessage();
}
附上官方api
/**
* Open the database according to the flags {@link #OPEN_READWRITE}
* {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}.
*
* <p>Sets the locale of the database to the the system's current locale.
* Call {@link #setLocale} if you would like something else.</p>
*
* @param path to database file to open and/or create
* @param factory an optional factory class that is called to instantiate a
* cursor when query is called, or null for default
* @param flags to control database access mode
* @return the newly opened database
* @throws SQLiteException if the database cannot be opened
*/
public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory,
@DatabaseOpenFlags int flags) {
return openDatabase(path, factory, flags, null);
}
通过这个获取数据库对象,然后进行update操作,发现数据没有被删,这次真是一次愚蠢的入坑,记下此坑。