![]() |
Copiar BD SQlite de android a PC
Buenos días, tengo una aplicación en Delphi para Android que usa una BD SQLite embebida.
Estoy intentando copiar la BD del dispositivo Android, un tfno. Xiaomi 10 Lite a mi PC para poder realizar un backup cada cierto tiempo. Estoy usando el comando ADB en el power shell de windows, para intentar copiar la BD en la SD del teléfono. Pero me da acceso denegado. El comando que envío es el siguiente: adb -s cf871144 -d shell run-as com.embarcadero.PDA_DelphiAniwin cp /data/user/0/com.embarcadero.PDA_DelphiAniwin/files/pruebaSQLite /storage/6935-D038 cf871144 es el nombre del dispositivo que se asigna a mi tfno y 6935-D038 es como aparece mi SD en el explorador de archivos de android. PDA_DelphiAniwin es mi proyecto de delphi y pruebaSQlite la BD No soy capaz de dar permisos a la SD, ¿alguna idea? Disculpar si este no es el foro adecuado para este tema, pero es que no veo otra opción de donde debería ir mi consulta. Gracias, un saludo. |
Hola, jmbarrio.
Esto me recuerda un programa que realicé para Windows, que tenía por objeto sincronizar los datos de dos programas gemelos, (uno para Windows y otro para Android) hace ya aalgunos años. Me parece que tuve que modificarlo hace unos dos o tres años por esas "cositas" que cambia Google cada vez que publica una nueva versión de Android. El programa pasaba los datos del móvil al PC y viceversa. Si aún no has resuelto el problema buscaré las fuentes en algún PC antiguo, ya que en el actual no las tengo. Es muy seguro que tendrás que adaptar algunas funciones y algunas rutas que yo utilizaba, pero creo que podría ayudarte. Dime si no has resuelto la cuestión, para buscar las fuentes. Lo probaré antes en Delphi 11 porque creo que estaba hacho en delphi 10. Un saludo. |
Buenos días, si fueras tan amable de enviarme el código te lo agradecería.
Muchísimas gracias, un saludo. |
1 Archivos Adjunto(s)
Hola jmbarrio.
Archivo Adjunto 4153 te envío el proyecto completo. Lo he revisado en Delphi 11 y funciona. Te explico un poco: 1.- Como te dije es bidireccional, del PC al móvil y del móvil al PC. 2.- Tienes que conectar el móvil por USB al PC. 3.- Detecta automáticamente los dispositivos conectados. 4.- Debes seleccionar tu móvil por su identificador. 5.- A continuación tienes dos opciones para copiar los archivos. PC-->Móvil y viceversa. 6.- El programa original está hecho para W32, pero corre bien en W64 Previamente debes haber modificado el código en la unidad Sincoinizar.pas para cambiar las 2 rutas (en el PC y en el Móvil) donde esstá el fichero que quieras transferir y la carpeta donde debe ser tranferido. (EN LOS DOS APARATOS) Espero que te sirva. Un saludo. |
Buenas tardes, muchísimas gracias por tu ayuda, en cuanto tenga un momento lo pruebo.
A que te refieres por debes seleccionar tu móvil por su identificador? ¿Es el nombre que le asigna el adb al hacer un adb devices? Un saludo |
Hola jmbarrio.
El nombre es el que tú le has puesto al teléfono y que puedes modificarle en cualquier momento. Y el que te sale en Windows 10 cuando conectas el dispositivo por USB. Cuando ejecutes el programa con el dispositivo conectado por USB, verás en la ventana del programa un ListBox en el que aparecerán los dispositivos conectados. Al elegir uno de ellos es cuando el programa inspecciona los directorios del dispositivo en busca del que tú le has indicado en la unidad Sincronizar.pas, y te lo mostrará en la pantalla. Ahora, cuando lo ejecutes, sin cambios, la primera vez, para probarlo, no aparecerá ninguna ruta, pues buscará la ruta qwue yo le puse en su momento, cambiala, en la unidad citada, por la ruta en la que tienes la base de datos en tu móvil y aparecerá. Haz los cambios de rutas y nombres de ficheros que quieras. Yo lo tenía preparado para copiar todos los ficheros de un directorio concreto. También podrias modificarlo para que te muestre todos los archivos de una carpeta. Es una idea. Alguna duda, no te prives de preguntarla. Un saludo. |
Muchas gracias de nuevo. A ver si mañana puedo trastear un poco.
Un saludo |
Buenas tardes johnalone, he mirado tu proyecto y necesitaría el contenido de la carpeta C:\RegiControl,
Veo que ahí hay un fichero .ini, que imagino que lleva la ruta de la carpeta de la sd interna del móvil que se sincroniza. Si que he visto la ruta de la carpeta del Pc, pero no veo la ruta de donde se cogen los datos del móvil. En mi caso la base de datos esta en la memoria interna en datos o data. Muchas gracias por las molestias y por tu tiempo, un saludo. |
Buenas de nuevo, me he creado en mi PC C:\RegiControl\TMP y ahí he puesto el fichero de la BD pruebaSQLite que sustituye a tu SDC.txt
he cambiado el la ruta "C:\RegiControl\TMP\SDC.txt" por "C:\RegiControl\TMP\pruebaSQLite" en sincronizar.pas Pero me tira error, imagino que pq me falta el .ini y las subcarpetas que hay en C:\RegiControl Si no entiendo mal, lo que hace el programa cuando pasa datos del móvil al pc, ¿es buscar en el dispositivo móvil el fichero SDC.txt y copiarlo en C:\RegiControl\TMP\? Gracias, un saludo. |
Hola, jmbarrio.
Aver. Te cuento. En mi caso, al ser dos programas gemelos, tenía que exportar todos los ficheros del móvil a una carpeta y desde esa carpeta se trasladaban al PC. El mismo proceso era a la inversa desde el PC al Móvil. Por éso las carpetas .tmp que eran las carpetas donde se hacía una copia de los ficheros del programa que exportaba, (por motivos de seguridad, si fallaba algo) ya que los dos deberían tener los fichero idénticos. En tu caso, tal como yo lo entiendo, (corrígeme si me equivoco) lo que pretendes es hacer una acopia en el PC de la base de datos del móvil y nada más. Yo te aconsejaría que, por segudidad, hicieras algo parecido. Es decir: En tu programa del móvil, genera una carpeta .tmp con la base de datos a exportar al PC. (Por seguridad) Genera una carpeta en el PC donde vayas a copiar los ficheros de la BD. Hazte un programa para Windows que simplemente exporte los datos de la carpeta de respaldo a un directorio .tmp, (ésto te garantiza que a la hora de recuperar la copia de la BD al móvil, en caso necesario, siempre tengas la original intacta) Ambos programas, deberán borrar el directoario .tmp creado cada vez que vayan a exportar una nueva copia, o bien machacar los ficheros de la carpeta .tmp. De ese modo, siempre tendrás dos copias en cada dispositivo: una nueva y otra antigua. En caso de accidente siempre tendrás alguna copia reciente y perderías los mínimos datos. (los de 1 día si haces las copias a diario) Mientras realizas este trabajo, si me dices las rutas de los dos directorios (PC y W) puedo intentar parchear el programa para que haga la copia del móvil al PC. Pero esto sería más inseguro y deberías plantearte la solución que te he comentado. Espero que no estés guardando los datos en la memoria interna (TPath.GetDocumentsPath) porque ahí no son accesibles y no aparecen cuando conectas el movil por USB. Perdona la charla. Un saludo. |
Muchas gracias JohnAlone, para nada charla, que menos por todas las molestias.
A ver te cuento, en el deployment del proyecto la base de datos embebida esta asignada al assets\internal del dispositivo android Si uso el comando adb la ruta a donde va la BD sería /data/user/0/com.embarcadero.PDA_DelphiAniwin/files/pruebaSQLite Si uso el Android Studio en el device file explorer la ruta es data/data/com.embarcadero.PDA_DelphiAniwin/files/pruebaSQLite Me da la sensación que la BD va a carpetas del sistema ¿Sabes si en el deployment le podría asignar otra ruta distinta al assets\internal? no sé como sería, assets\external o assets\SD..... no se si tu sabes como le podría decir una ruta de la Sd externa o de la SD interna compartida Muchas gracias por tu tiempo, un saludo. |
Hola, jmbario.
Como sospechaba, tu base está en las carpetas internas del sistema a las que se accede desde TPath.GetDocumentsPath, pero esas carpetas no las lista Windows. Usando TPath.GetSharedDocumentsPath , accedes a la SD, si no hay, a los ficheros del dispositivo que son visibles. Éstos ficheros son los que usa el programa. Son más útiles, pues on accesibles desde Windows, y puedes hacer la copia sin ningún programa intermediario como el que estamos hablando. Tener un programa intermediario, es por facilitar a los usuarios las copias. Si usas GetShared podrás acceder desde W en una ruta similar a esta: Este equipo\Nombre de tu Móvill\Tarjeta SD\Android\data\Nombre de tu programa\files\, en la tarjeta SD, o bien Este equipo\Nombre de tu móvil\Almacenamiento interno\Android\data\nombre de tu programa\files\ , si se aalmacenan los datos en el el teléfono, (pero no en la carpeta assets/internal Yo suelo crear un directorio de datos personalizado en la SD o en la meoria interrna no en (ssets/internal) Te comento todo esto, aunque tu, seguramente ya lo sabes, por si lo lee en el foro alquier que no lo tenga claro. No sé si con ésto te hago un lío o te he aclarado algo. Dame unos días, a ver si me pongo al día de cómo iba el programa RegiControlSincro y puedo adaptarlo para cualquier carpeta. Un saludo. |
Buenas tardes, ya me intuía yo algo así o parecido.
El problema es que no se si en el deployment del proyecto puedo cambiar la ruta de la bd embebida y ponerla en Sd interna compartida o en la sd externa. Desconozco si tiene que ir, si o si en el assets/internal Te agradezco un montón tu dedicación, muchas gracias. Un saludo. |
Bueno, jmbarrio. No entro a menudo en el foro. Para éso están los expertos. Sólo cuendo tengo una necesidad de ayuda. Pero cuando entro, veo si puedo ayudar a alguien que lo necesite y me entretengo un poco.
Mira, como te he dicho, yo suelo utilizar alguna carpeta personalizada que abro, como dije, en la SD o en la memoria del móvil que no es assets/internal. Si tengo que exportar algun fichero (o una BD inicializada) lo que hago es exportarla con la instalación del programa en assets/internal y luego copiarla a la carpeta de datos que he creado con el programa. Si no me va a servir el fichero exportado con assets lo borro y sigo almacenando la información en la carpeta personalizada. Como te he dicho, y con ánimo de ayudar también a otros miembros del foro, miraré a ver si no me cuesta mucho tiempo, generalizar el programa de transferencia de datos PC<-->Movil, para que sirva para cualquiera que lo necesite. Un saludo,. |
Buenos días JohnAlone, he intentado hacer lo que comentaste en tu ultimo mensaje.
El deployment de instalación de la BD sigue en assets/internal En la carpeta documentos de la memoria interna he copiado la bd pruebaSQLite. He modificado el siguiente código. ; Sin embargo al realizar la instalación en el dispositivo cuando va a arrancar la apk se queda en negro, como que no coge el acceso a la BD. ¿Pq me pasa esto? Gracias, un saludo |
Hola.
Si has copiado tú el fichero manualmente en la carpeta Doccuments del móvil o de la SD, no te la puede leer. Crea tú la carpeta desde tu App en un directorio propio que tu abres en donde te venga bien. Estoy trabajando den una rutina para hacer esto desde el programa. Cuando la termine te comento. Un saludo. |
1 Archivos Adjunto(s)
Hola jmbarrio.
Archivo Adjunto 4154 Aquí está lo prometido. Es un programa pequeñito para demostrar cómo se puede seleccionar el Directorio de Datos para tu programa. Puedes añadirlo en cualquier programa con un poco de habilidad. Puedes elegir, al instalar el programa, el directorio y si quieres en la SD o en la memoria interna del dispositivo. Espero que te sirva a tí, o a cualquier miembro del foro. Cuando uno se esfuerza en ayudar, se agradece un poco de "feedback", sólo para saber que ha servido de algo. También voy a intentar hacer un programa para W que sirva para Sincronizar ficheros con el móvil, que no sea tan concreto como el que yo usaba, sino que sea más general para usarlo en cualquier momento y con cualquier archivo en cualquier localización. No lo veo muy fácil, así que puedo tardar un poco. Si lo consigo, lo publicaré para tí y para quien le pueda servir, (ésta es mi costumbre). Un Saludo. |
La franja horaria es GMT +2. Ahora son las 20:37:34. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi