android 数据库不存在/未加载到Expo内置应用程序中

blpfk2vs  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(285)

我正在尝试启动一个React-Native和Expo应用程序,但我遇到了一个大问题:该应用程序使用预制的SQLite数据库来读取和更新信息。
此数据库在应用程序首次启动时加载到应用程序中,或者如果版本已更新(通过简单变量)。
我通过Expo客户端测试了该应用程序,没有任何问题,但现在我在手机上尝试(通过APK),没有数据库,我不知道为什么它不工作。
加载数据库的代码:

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

字符串
metro.config.js中:

  1. module.exports = {
  2. resolver: {
  3. blacklistRE: blacklist([/amplify\/#current-cloud-backend\/.*/]),
  4. assetExts: ["db", "ttf", "png", "jpg"]
  5. },
  6. transformer: {
  7. getTransformOptions: async () => ({
  8. transform: {
  9. experimentalImportSupport: false,
  10. inlineRequires: false,
  11. },
  12. }),
  13. },
  14. };


app.json中:

  1. "assetBundlePatterns": [
  2. "src/library/assets/**/*",
  3. "src/library/databases/*",
  4. "src/library/fonts/*"
  5. ],
  6. "packagerOpts": {
  7. "assetExts": ["db"]
  8. },


我试过这两种方法:

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


以及:

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


在应用程序尝试从数据库加载东西后,我得到以下错误:
您访问的页面不存在!/data/user/0/com. company. myApp/files/SQLite/programs-2020052401.db
我还尝试将源数据库从.db下载更改为.mp4,但它也不这样做。
我该怎么解决呢?

zi8p0yeb

zi8p0yeb1#

解决方案

在对它进行修补以隔离问题之后,我最终发现问题在于,将在设备中保存数据库的目录(SQLite)没有使用downloadAsync创建,如果我更仔细地阅读文档,我就会知道这一点。如果它不存在,我只需要首先创建目录,然后它就可以正常工作了。
下面是代码最终的样子:

  1. // Check if the directory where we are going to put the database exists
  2. let dirInfo;
  3. try {
  4. dirInfo = await FileSystem.getInfoAsync(`${FileSystem.documentDirectory}SQLite`);
  5. } catch(err) { Sentry.captureException(err) };
  6. if (!dirInfo.exists) {
  7. try {
  8. await FileSystem.makeDirectoryAsync(`${FileSystem.documentDirectory}SQLite`, { intermediates: true });
  9. } catch(err) { Sentry.captureException(err) }
  10. };
  11. // Downloads the db from the original file
  12. // The db gets loaded as read only
  13. FileSystem.downloadAsync(
  14. Asset.fromModule(require('../databases/programs.db')).uri,
  15. `${FileSystem.documentDirectory}SQLite/programs${version}.db`
  16. ).then(() => {
  17. programsDB = SQLite.openDatabase(`programs${version}.db`); // We open our downloaded db
  18. loadDB(loaded); // We load the db into the persist store
  19. }).catch(err => Sentry.captureException(err));

字符串

展开查看全部

相关问题