【发布时间】:2018-11-01 18:13:16
【问题描述】:
我的应用程序资产文件夹中保存了一个数据库,当应用程序首次打开时,我使用以下代码复制数据库。
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;
}
上面的代码运行没有问题,但是当你尝试查询数据库时,你得到一个 SQLite: No such table 异常。
此问题仅在 Android P 中出现,所有早期版本的 Android 都可以正常工作。
这是 Android P 的一个已知问题还是发生了一些变化?
【问题讨论】:
-
你能检查你的 inputStream 是否不为空吗?使用 Android 调试器?
-
我可以确认 InputStream 不为空。
-
在
return true之前添加Log.d("COPYINFO","Bytes Copied = " + String.valueOf(totalcount) + " to " + filepath);日志的结果输出是什么? -
运行 Android 8.1 的设备上的输出是 (D/COPYINFO: Bytes Copied = 1687552 to /data/user/0/am.radiogr/databases/s.db) 输出在 Android P 上是 (D/COPYINFO: Bytes Copied = 1687552 to /data/user/0/am.radiogr/databases/s.db) 它们完全一样。
-
我的下一步,显然正在复制数据库,将检查数据库中的表。要么查询 sqlite_master 表,要么我个人从这里使用 logDatabaseInfo 方法[是否有任何方法可以帮助解决常见的 SQLite 问题? ](stackoverflow.com/questions/46642269/…)。
标签: android sqlite android-9.0-pie