首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在React-Native应用程序上下载和使用SQLite数据库

在React-Native应用程序上下载和使用SQLite数据库
EN

Stack Overflow用户
提问于 2017-09-19 19:28:58
回答 1查看 2.4K关注 0票数 1

我需要使用react-native-sqlite-storage (由dryganet:https://github.com/dryganets/react-native-sqlite-storage/tree/sergeyd/sqlite-cipher修改)打开预先填充的加密数据库,这个预先填充的数据库是使用react-native-fs从远程位置下载的。

此时,当我将数据库放入assets文件夹(这个数据库是在react-native run-android命令期间复制的)并触发方法“openDatabase”时:

代码语言:javascript
复制
const dbName = "myDatabase.db";
const dbLocation = "~database.db";
const encryptionLey = "asdfghasdfgh";

const queryDatabase = async (tx) => {
  const [sqliteTx, results] = await tx.executeSql(sqlQuery);
  resultData = results;
};

const db = await SQLite.openDatabase({ 
    name: dbName,
    createFromLocation: dbLocation, 
    key: encryptionKey
 }, (result) => {...}, (result) => {...});

await db.transaction(queryDatabase);

retrun resultData;

一切正常,但是我需要在运行时下载这个数据库,所以...当我将dbLocation更改为:

代码语言:javascript
复制
const dbLocation = fs.DocumentDirectoryPath + "/database.db";

并从远程位置下载sqlite数据库:

代码语言:javascript
复制
fs.downloadFile({,
      fromUrl: "http://10.0.2.2:63074/Database/GetDatabase",
      toFile: dbLocation,
    }).promise.then(res => {
      fs.exists(dbLocation).then(fileExist => {
        ...
      });
    });

所有东西都停止工作,没有错误发生,在调试控制台中我可以看到:

代码语言:javascript
复制
OPEN database: myDatabase.db
new transaction is waiting for open operation

问题出在哪里?我使用SQLCipher对数据库进行加密和解密。也许还有另一种方法可以实现这一点,这个解决方案必须同时适用于安卓和iOS?

EN

回答 1

Stack Overflow用户

发布于 2017-09-19 23:59:18

好吧,我自己找到了解决方案,在原生Java代码中,有这样的地方:

代码语言:javascript
复制
        if (assetFilePath != null && assetFilePath.length() > 0) {
            if (assetFilePath.compareTo("1") == 0) {
                assetFilePath = "www/" + dbname;
                in = this.getContext().getAssets().open(assetFilePath);
                FLog.v(TAG, "Located pre-populated DB asset in app bundle www subdirectory: " + assetFilePath);
            } else if (assetFilePath.charAt(0) == '~') {
                assetFilePath = assetFilePath.startsWith("~/") ? assetFilePath.substring(2) : assetFilePath.substring(1);
                in = this.getContext().getAssets().open(assetFilePath);
                FLog.v(TAG, "Located pre-populated DB asset in app bundle subdirectory: " + assetFilePath);
            } else {
                File filesDir = this.getContext().getFilesDir();
                assetFilePath = assetFilePath.startsWith("/") ? assetFilePath.substring(1) : assetFilePath;
                File assetFile = new File(filesDir, assetFilePath);
                in = new FileInputStream(assetFile);
                FLog.v(TAG, "Located pre-populated DB asset in Files subdirectory: " + assetFile.getCanonicalPath());
                if (openFlags == SQLiteDatabase.OPEN_READONLY) {
                    dbfile = assetFile;
                    FLog.v(TAG, "Detected read-only mode request for external asset.");
                }
            }
        }

这意味着在这种情况下我需要设置createFromLocation:"database.db",因为路径的其余部分将在java本机代码中自动添加。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46299268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档