一次愚蠢的入坑记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_he_n/article/details/83012775

场景

我现在需要修改数据库中的数据,不止一个数据库,而是整个项目中的所有数据库,对我们的数据库其他应用可以访问,哈哈哈哈。对于为什么要这个么干,我不想吐槽,因为不得不这么干。大概有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操作,发现数据没有被删,这次真是一次愚蠢的入坑,记下此坑。

猜你喜欢

转载自blog.csdn.net/c_he_n/article/details/83012775