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

blpfk2vs  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(181)

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

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,但它也不这样做。
我该怎么解决呢?

zi8p0yeb

zi8p0yeb1#

解决方案

在对它进行修补以隔离问题之后,我最终发现问题在于,将在设备中保存数据库的目录(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));

字符串

相关问题