2017-09-19 1 views
1

J'ai besoin d'ouvrir la base de données cryptée pré-utilisateur en utilisant react-native-sqlite-storage (modifié par dryganet: https://github.com/dryganets/react-native-sqlite-storage/tree/sergeyd/sqlite-cipher), cette base de données pré-remplies est téléchargée à partir de l'emplacement distant en utilisant react-native-fs.Télécharger et utiliser la base de données SQLite sur React-Native Application

A ce moment où je mets la base de données dans des actifs dossier (cette base de données est copié lors de la commande react-native run-android) et la méthode de feu « OpenDatabase »:

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; 

tout fonctionne correctement, mais je dois télécharger cette base de données lors de l'exécution , donc ... quand je change EmplacementBD à:

const dbLocation = fs.DocumentDirectoryPath + "/database.db"; 

et télécharger la base de données SQLite de distance:

fs.downloadFile({, 
     fromUrl: "http://10.0.2.2:63074/Database/GetDatabase", 
     toFile: dbLocation, 
    }).promise.then(res => { 
     fs.exists(dbLocation).then(fileExist => { 
     ... 
     }); 
    }); 

Tout ne fonctionne plus, aucune erreur occures, dans la console de débogage je peux voir ceci:

OPEN database: myDatabase.db 
new transaction is waiting for open operation 

Où est le problème? J'utilise SQLCipher pour crypter et décrypter la base de données. Peut-être existe-t-il un autre moyen d'y parvenir, la solution doit fonctionner à la fois sur Android et iOS?

Répondre

0

Ok, je me suis trouvé une solution par, dans le code Java natif, il y a lieu comme:

 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."); 
       } 
      } 
     } 

Cela signifie que je dois mettre createFromLocation:"database.db" dans ce cas, parce que le repos du chemin sera ajouté automatiquement dans Java code natif.