【问题标题】:React native - Expo SQLite - Unable to resolve module ../assets/terezeen.dbReact native - Expo SQLite - 无法解析模块../assets/terezeen.db
【发布时间】:2023-01-18 21:17:25
【问题描述】:

我用 expo 文件系统和资产包安装了 expo SQLite 包。 我正在尝试加载预配置的数据库,但我不断收到以下错误:

Android Bundling failed 341ms
Unable to resolve module ../assets/terezeen.db from D:\Skola\Vysoka\bakala\frontend\App.js:

None of these files exist:
  * terezeen.db
  * ..\assets\terezeen.db\index(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
  23 |   }
  24 |   await FileSystem.downloadAsync(
> 25 |     Asset.fromModule(require("../assets/terezeen.db")).uri,
     |                               ^
  26 |     FileSystem.documentDirectory + "SQLite/terezeen.db"
  27 |   );
  28 |   return SQLite.openDatabase("terezeen.db", "1.0");

应用程序.js

import * as SQLite from 'expo-sqlite';
import * as FileSystem from 'expo-file-system';
import { Asset } from 'expo-asset';

async function openDb() {
  if (!(await FileSystem.getInfoAsync(FileSystem.documentDirectory + "SQLite")).exists) {
    await FileSystem.makeDirectoryAsync(FileSystem.documentDirectory + "SQLite");
  }
  await FileSystem.downloadAsync(
    Asset.fromModule(require("../assets/terezeen.db")).uri,
    FileSystem.documentDirectory + "SQLite/terezeen.db"
  );
  return SQLite.openDatabase("terezeen.db", "1.0");
}

export default function App() {
  const db = openDb();

地铁.config.js

const { getDefaultConfig } = require("metro-config");

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts },
  } = await getDefaultConfig();
  return {
    transformer: {
      babelTransformerPath: require.resolve(
        "react-native-svg-transformer"
      ),
    },
    resolver: {
      assetExts: [
        assetExts.filter((ext) => ext !== "svg"),
        assetExts.push('db')
      ],
      sourceExts: [...sourceExts, "svg"],
    },
  };
})();

react-native.config.js

module.exports = {
    project: {
        ios: {},
        android: {}
    },
    assets:['./assets/fonts/'],
    dependencies: {
        "react-native-sqlite-storage": {
          platforms: {
            android: {
                sourceDir:
                    "../node_modules/react-native-sqlite-storage/platforms/android-native",
                    packageImportPath: "import io.liteglue.SQLitePluginPackage;",
                    packageInstance: "new SQLitePluginPackage()"
                }
            }
        }
    }
}

文件树:

|assets
|--fonts
|  |--font.otf <-- here is the method
|--terezeen.db
|
|src
|--assets <- just for case of the problem
   |--fonts
      |--font.otf
   |--terezeen.db
|
|App.js <- file that calls the sqlite

安装这些 expo 软件包后,我也被禁止使用自定义字体,因为现在它找不到了。

【问题讨论】:

    标签: react-native expo expo-sqlite


    【解决方案1】:

    我已经像这样编辑了 metro.config.js:

    const { getDefaultConfig } = require('expo/metro-config');
    
    const defaultConfig = getDefaultConfig(__dirname);
    
    defaultConfig.resolver.assetExts.push('db');
    
    module.exports = defaultConfig;
    

    另外,我认为数据库的目录应该与 android 链接,所以我没有将它链接到根目录,而是将它链接到 android 目录。 现在代码如下所示:

    async function openDb() {
      if (!(await FileSystem.getInfoAsync(FileSystem.documentDirectory + "SQLite")).exists) {
        await FileSystem.makeDirectoryAsync(FileSystem.documentDirectory + "SQLite");
      }
      await FileSystem.downloadAsync(
        Asset.fromModule(require("./src/assets/terezeen.db")).uri,
        FileSystem.documentDirectory + "SQLite/terezeen.db"
      );
      return SQLite.openDatabase("terezeen.db", "1.0");
    }
    
    export default function App() {
      const db = openDb();
    

    【讨论】: