数据库不存在/未加载到世博会的构建应用程序中



在过去的几个月里,我一直在用 react native 和 Expo 做我的第一个应用程序项目。

我终于准备好启动我的应用程序,但我遇到了一个大问题:该应用程序使用预制的 sqlite 数据库来读取和更新信息,该数据库在首次启动或版本已更新时加载到应用程序中(通过一个简单的变量(。我通过世博会客户端测试了该应用程序,没有问题,但是现在我正在手机中尝试(通过apk(没有db,我不知道为什么它不起作用

下面是加载数据库的代码:

FileSystem.downloadAsync(
Asset.fromModule(require('../databases/programs.db')).uri,
`${FileSystem.documentDirectory}SQLite/programs-${version}.db`
).then(() => {
programsDB = SQLite.openDatabase(`programs-${version}.db`);
loadDB(loaded);
});

我在metro.config.js中有这个:

module.exports = {
resolver: {
blacklistRE: blacklist([/amplify/#current-cloud-backend/.*/]),
assetExts: ["db", "ttf", "png", "jpg"]
},
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

这在app.json中

"assetBundlePatterns": [
"src/library/assets/**/*",
"src/library/databases/*",
"src/library/fonts/*"
],
"packagerOpts": {
"assetExts": ["db"]
},

我都试过了

require('../databases/programs.db'

require('library/databases/programs.db'

应用程序尝试从数据库加载内容后,出现以下错误: "/data/user/0/com.company.myApp/files/SQLite/programs-2020052401.db 的目录不存在">

我还尝试在其他地方阅读答案后将源数据库从.db下载更改为.mp4,但它也没有这样做。

有什么想法吗?这是我最终启动应用程序之前的最后一道障碍。

解决方案

在修补它以隔离问题后,我最终发现问题是要保存在设备中的数据库的目录 (SQLite( 不是使用 downloadAsync 创建的,如果我更仔细地阅读文档,我就会知道这一点。 如果它不存在,我只需要先制作目录,然后它就可以正常工作。

以下是编码最终的外观:

// Check if the directory where we are going to put the database exists
let dirInfo;
try {
dirInfo = await FileSystem.getInfoAsync(`${FileSystem.documentDirectory}SQLite`);
} catch(err) { Sentry.captureException(err) };
if (!dirInfo.exists) {
try {
await FileSystem.makeDirectoryAsync(`${FileSystem.documentDirectory}SQLite`, { intermediates: true });
} catch(err) { Sentry.captureException(err) }
};
// Downloads the db from the original file
// The db gets loaded as read only
FileSystem.downloadAsync(
Asset.fromModule(require('../databases/programs.db')).uri,
`${FileSystem.documentDirectory}SQLite/programs${version}.db`
).then(() => {
programsDB = SQLite.openDatabase(`programs${version}.db`); // We open our downloaded db
loadDB(loaded); // We load the db into the persist store
}).catch(err => Sentry.captureException(err));

最新更新