相关疑难解决方法(0)

Android P - 从资产复制数据库后'SQLite:没有这样的表错误'

我有一个数据库保存在我的应用程序资产文件夹中,并在应用程序首次打开时使用以下代码复制数据库.

inputStream = mContext.getAssets().open(Utils.getDatabaseName());

        if(inputStream != null) {

            int mFileLength = inputStream.available();

            String filePath = mContext.getDatabasePath(Utils.getDatabaseName()).getAbsolutePath();

            // Save the downloaded file
            output = new FileOutputStream(filePath);

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = inputStream.read(data)) != -1) {
                total += count;
                if(mFileLength != -1) {
                    // Publish the progress
                    publishProgress((int) (total * 100 / mFileLength));
                }
                output.write(data, 0, count);
            }
            return true;
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码运行没有问题,但是当你尝试查询数据库时,你会得到一个SQLite:没有这样的表异常.

此问题仅发生在Android P中,所有早期版本的Android都能正常工作.

这是Android P的已知问题还是有些变化?

sqlite android android-9.0-pie

44
推荐指数
4
解决办法
1万
查看次数

在Android Pie中禁用sqlite预写日志记录

在Android Pie中,默认情况下启用了sqlite预写日志记录(WAL)。这仅在Pie设备中导致我现有代码的错误。由于无法访问WAL,SQLiteDatabase.disableWriteAheadLogging()或者PRAGMA journal_mode由于我访问数据库的方式,我无法成功关闭WAL 。我想使用名为db_compatibility_wal_supported的Android设置完全禁用WAL :

适用于应用程序的兼容性WAL(预写日志)

有人知道如何配置吗?我不知道该文件是否可以在启动时以编程方式更改,或者是否可以手动更改。


有关该问题的更多详细信息

我的应用程序中有一个sqlite数据库(20mb + / 250k记录)。该数据库是使用我的服务器上的纯Java生成的。它包含一个食物数据库,该应用程序的用户可以添加到数据库中(并且服务器已更新)。这存储在android的assets文件夹中。在首次安装期间,数据库从资产复制到app文件夹,以便可以使用以下有效方法将其写入:

从资产文件夹复制SQLite数据库

不幸的是,一旦我开始使用SqlDroid写入数据库,就会启用wal,原始数据库中的表将消失,仅保留任何新创建的表。但是,数据库的大小仍为20mb +。所有数据库错误均归因于缺少表。表格复制和写入方法可以在Pie之前的Android版本中完美运行。

sqlite android wal sqldroid

8
推荐指数
2
解决办法
2293
查看次数

标签 统计

android ×2

sqlite ×2

android-9.0-pie ×1

sqldroid ×1

wal ×1