Je viens de découvrir Realm et je voulais l'explorer plus en détail. J'ai donc décidé de créer un exemple d'application et de le gâcher. Jusqu'ici tout va bien.
Cependant, je n'ai pas encore trouvé de solution pour savoir comment afficher ma base de données dans le navigateur de domaines. Comment cela peut-il être fait?
Actuellement, le navigateur de domaines ne prend pas en charge l'accès aux bases de données directement sur le périphérique. Vous devez donc copier la base de données à partir de l'émulateur/du téléphone pour l'afficher. Cela peut être fait en utilisant ADB:
adb pull /data/data/<packagename>/files/ .
Cette commande extraira tous les fichiers de domaines créés avec Realm.getInstance(new RealmConfiguration.Builder().build())
. La base de données par défaut s'appelle default.realm
.
Notez que cela ne fonctionnera que sur un émulateur ou si le périphérique est enraciné.
Vous pouvez maintenant afficher la base de données Realm sur le navigateur Chrome à l'aide de Stetho , développé par Facebook. Par défaut, Stetho permet de visualiser les préférences SQLite, réseau, partagées, mais avec un supplément de plugin ici , permet également de visualiser le Royaume.
Après avoir configuré votre classe Application
avec les bibliothèques ci-dessus, alors que l'application est en cours d'exécution et connectée, ouvrez le navigateur Chrome et naviguez chrome://inspect
pour voir
Puis Resources->Web Sql->default.realm
Vous pouvez également extraire votre fichier de tout périphérique non root à l'aide du shell ADB et de la commande run-as.
Vous pouvez utiliser ces commandes pour extraire de la mémoire privée de votre application une base de données nommée nom_fichier_database_database située dans le dossier de fichiers:
adb Shell "run-as package.name chmod 666 /data/data/package.name/files/your_database_file_name"
// For devices running an Android version lower than Android 5.0 (Lollipop)
adb pull /data/data/package.name/files/your_database_file_name
// For devices running an Android version equal or grater
// than Android 5.0 (Lollipop)
adb exec-out run-as package.name cat files/your_database_file_name > your_database_file_name
adb Shell "run-as package.name chmod 600 /data/data/package.name/files/your_database_file_name"
Si vous êtes paresseux pour obtenir chaque fois le fichier de base de données realm avec adb, vous pouvez ajouter une fonction d'exportation à votre code Android, qui vous envoie un courrier électronique avec le fichier de base de données realm en pièce jointe.
Voici un exemple:
public void exportDatabase() {
// init realm
Realm realm = Realm.getInstance(getActivity());
File exportRealmFile = null;
try {
// get or create an "export.realm" file
exportRealmFile = new File(getActivity().getExternalCacheDir(), "export.realm");
// if "export.realm" already exists, delete
exportRealmFile.delete();
// copy current realm to "export.realm"
realm.writeCopyTo(exportRealmFile);
} catch (IOException e) {
e.printStackTrace();
}
realm.close();
// init email intent and add export.realm as attachment
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, "YOUR MAIL");
intent.putExtra(Intent.EXTRA_SUBJECT, "YOUR SUBJECT");
intent.putExtra(Intent.EXTRA_TEXT, "YOUR TEXT");
Uri u = Uri.fromFile(exportRealmFile);
intent.putExtra(Intent.EXTRA_STREAM, u);
// start email intent
startActivity(Intent.createChooser(intent, "YOUR CHOOSER TITLE"));
}
N'oubliez pas d'ajouter cette autorisation utilisateur à votre fichier manifeste Android:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Pour obtenir une copie d'une base de données Realm sur votre appareil, accédez à Explorateur de fichiers de l'appareil dans Android Studio.
Naviguez jusqu'à /data/data/your.package.name/files/
.
Vous y trouverez vos fichiers * .realm. Faites un clic droit, puis Enregistrer sous . Assurez-vous de synchroniser avant de les enregistrer.
Utilisez navigateur de royaume ou n’importe lequel de ceux-ci pour afficher les fichiers * .realm:
Il y a une solution de contournement. Vous pouvez accéder directement au fichier à partir du moniteur du périphérique. Vous pouvez accéder à ce répertoire uniquement lorsque vous utilisez un émulateur ou un périphérique racine.
Dans Android Studio:
Sélectionnez
Menu Outils → Android → Moniteur d'appareil Android → Explorateur de fichiers → données → données → (Nom de votre package) → fichiers → * db.realm
Extrayez ce fichier du périphérique:
De Android Studio 3, canary 1, l'explorateur de fichiers de périphériques a été introduit. Vous devez regarder le fichier de domaine ici. Ensuite, (sélectionnez votre package) → sélectionnez le fichier de domaine → cliquez avec le bouton droit de la souris et enregistrez.
Et ouvrez le fichier dans le navigateur de domaines. Vous pouvez voir vos données maintenant.
Vous pouvez accéder directement au fichier de domaine. Voici la solution que j'ai utilisée.
Tout d'abord, vous pouvez copier le fichier de domaine situé dans '/ data/data/packagename/files' dans Environment.getExternalStorageDirectory () + '/ FileName.realm':
public class FileUtil {
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
Realm realm = null;
try {
realm = Realm.getInstance(this);
File f = new File(realm.getPath());
if (f.exists()) {
try {
FileUtil.copy(f, new File(Environment.getExternalStorageDirectory()+"/default.realm"));
}
catch (IOException e) {
e.printStackTrace();
}
}
}
finally {
if (realm != null)
realm.close();
}
Deuxièmement, utilisez l'outil ADB pour extraire ce fichier comme ceci:
$ adb pull /sdcard/default.realm.
Vous pouvez maintenant ouvrir le fichier dans le navigateur de domaines.
Voici une solution qui n'exige pas que votre téléphone soit enraciné, en utilisant la commande run-as
présente dans le shell de adb
. La seule condition préalable est qu'une version de débogage de votre application soit installée sur le téléphone cible.
$ adb Shell
$ run-as com.yourcompany.yourapp # pwd will return /data/data/com.yourcompany.yourapp
$ cp files/default.realm /sdcard
$ exit
$ exit
$ adb pull /sdcard/default.realm ~/Desktop # or wherever you want to put it
Vous aurez une copie de la base de données à partir de n’importe quel téléphone de votre répertoire local, que vous pourrez ensuite charger sur le navigateur de domaines.
Vous pouvez maintenant y accéder directement si vous utilisez un émulateur.
Premier Enregistrez le chemin où se trouve le fichier dans l'émulateur comme @bmunk dit:
Log.d(TAG, "path: " + realm.getPath());
Second Recherchez-le et faites un clic droit sur le fichier et choisissez "Enregistrer sous", dans la boîte de dialogue apparaît l'itinéraire où se trouve réellement le fichier dans votre système .
Ensuite, collez simplement la route dans la boîte de dialogue "Ouvrir un fichier local" de Realm Studio.
(J'ai testé cela sous Windows uniquement)
Voici mon script Shell prêt à l'emploi. Il suffit de changer le nom du paquet et vos chemins adb, le script fera le nécessaire.
#!/bin/sh
ADB_PATH="/Users/medyo/Library/Android/sdk/platform-tools"
PACKAGE_NAME="com.mobiacube.elbotola.debug"
DB_NAME="default.realm"
DESTINATION_PATH="/Users/Medyo/Desktop/"
NOT_PRESENT="List of devices attached"
ADB_FOUND=`${ADB_PATH}/adb devices | tail -2 | head -1 | cut -f 1 | sed 's/ *$//g'`
if [[ ${ADB_FOUND} == ${NOT_PRESENT} ]]; then
echo "Make sure a device is connected"
else
${ADB_PATH}/adb Shell "
run-as ${PACKAGE_NAME} cp /data/data/${PACKAGE_NAME}/files/${DB_NAME} /sdcard/
exit
"
${ADB_PATH}/adb pull "/sdcard/${DB_NAME}" "${DESTINATION_PATH}"
echo "Database exported to ${DESTINATION_PATH}${DB_NAME}"
fi
Plus de détails sur cet article de blog: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-Android/
Garder les choses simples:
/Users/inti/Library/Android/sdk/platform-tools/adb exec-out run-as com.mydomain.myapp cat files/default.realm > ~/Downloads/default.realm
Explication:
adb
. Si vous utilisez Android Studio, consultez Fichier> Structure du projet> Emplacement du SDK> Android Emplacement du SDK et ajoutez platform-tools
à ce chemin.run-as
NB: Le fichier s'appelle default.realm car je n’ai pas changé son nom lors de sa configuration - le vôtre peut être différent.
Vous avez peu d'options pour afficher vos fichiers de domaine Android:
Comme @Christian Melchior a déclaré que vous pouvez extraire votre base de données de royaume de l’appareil et l’ouvrir sur votre mac à l’aide de navigateur OSX Realm
Vous pouvez utiliser un tiers navigateur de royaume Android que j’ai créé pour faciliter le développement de Android avec le royaume. L'application vous montrera tous les fichiers de royaume sur votre appareil et vous pourrez voir tous vos fichiers de royaume en temps réel tout en testant votre application.
Vous pouvez utiliser le navigateur Chrome Stetho La description complète de l'utilisation de Setho est fournie par @Jemshit Iskendero answer.
Voici un shell pour les paresseux comme moi :)
Le fichier .realm
sera stocké dans le dossier tmpRealm/
à côté du fichier .sh
.
#!/bin/sh
adb Shell 'su -c "
cd /data/data/<packagename>/files
ls
rm -rf /data/local/tmp/tmpRealm/
mkdir /data/local/tmp/tmpRealm/
cp /data/data/com.arefly.sleep/files/* /data/local/tmp/tmpRealm
chown Shell.shell /data/local/tmp/tmpRealm/*
"'
rm -rf ./tmpRealm/
adb pull /data/local/tmp/tmpRealm ./
Ou si vous préférez laisser tmpRealm/
être sur la carte SD:
#!/bin/sh
adb Shell 'su -c "
cd /data/data/com.arefly.sleep/files
ls
mount -o rw,remount $EXTERNAL_STORAGE/
rm -rf $EXTERNAL_STORAGE/tmpRealm
mkdir $EXTERNAL_STORAGE/tmpRealm
cp /data/data/com.arefly.sleep/files/* $EXTERNAL_STORAGE/tmpRealm
"'
rm -rf ./tmpRealm/
# http://unix.stackexchange.com/a/225750/176808
adb pull "$(adb Shell 'echo "$EXTERNAL_STORAGE"' | tr -d '\r')/tmpRealm" ./
Référence: