Spanish txt o BD

23021959Pepe

Member
Licensed User
Longtime User
Hola cuando salgo al campo necesito tomar coordenadas de varios lugares, mi duda es si guardarlos en un archivo txt o una BD.
El problema de la Base de Datos es, que seria en un archivo de SQLite y en la oficina tenemos Access, por lo que no podría leerlo.
En cuanto a guardar los datos en un txt, he probado el ejemplo de Jesús (bgsoft), en contestación a la pregunta de casan79 en el post Formularios y txt, pero el archivo de ejemplo txt que me he creado no se donde copiarlo en el móvil, por lo que cuando ejecuto el ejemplo citado por Jesús me da un mensaje de que no hay datos, pero ya no se si es porque no lee el archivo o porque los datos que he introducido en el txt deben de ir con algún formato en especia (encerrados entre comillas, uno a continuación de otro separado por un coma etc...).
He leído el tutorial que propone bgsoft, pero me he quedado igual que estaba, por lo que sigo sin tener ni puñetera idea de que hay que hacer.

Saludos
Pepe
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pepe

Soy Jesus :D , no se a que Post te refieres, asi que me resulta dificil ayudarte.
Por que no pones esa parte del código que has echo y no te funciona y asi alguno podremos ayudarte?
En algun Post he puesto como leer y escribir ficheros, e incluso en uno escribí dos sub con un LeerFicheros y otro con EscribirFicheros, ese código lo empleo en mis apps, por lo tanto funciona, posiblemente lo que te ocurra sea que dejas de inicializar la lista, o no pones correctamente el directorio donde grabarlo. Pon esa parte del codigo, y seguro que alguno podremos ayudarte

Saludos
 

cuellar

Member
Licensed User
Longtime User
pero el archivo de ejemplo txt que me he creado no se donde copiarlo en el móvil

Crea el archivo en la carpeta raiz de la tarjeta SD con File.DirRootExternal, con el permiso de aplicación EXTERNAL_STORAGE.
O bién una carpeta de tu aplicación también en la tarjeta SD con File.DirDefaultExternal.
 

DATASOFT (SOLUSOFT S A)

Member
Licensed User
Longtime User
agregando: la primera opción es muy viable para lo que es las pruebas del sistema debido aq solo te vas a la sd y ves todo rapidamente ni te tomas la molestia de navegar entre tus carpetas
la segunda opción es mas "organizada" por asi decirlo.

y de paso me gustaria saber si desde B4A hay alguna forma de conceder o quitar permisos a los archivos que se crean. ejemplo permiso de solo lectura a un archivo .txt que recien he creado para que no sea fácilmente borrado o modificado.
 

23021959Pepe

Member
Licensed User
Longtime User
Buenas tardes, he tardado en contestar a vuestras sugerencias porque he estado probando para ver si conseguía algo, pero me funciona a medias. Solamente funciona y lee los datos la primera vez, si cierro la aplicación y la vuelvo a ejecutar ya no lee el archivo txt.
Jesús este es el código con el que estoy practicando y como digo solamente se me ejecuta una vez y siempre y cuando copie los archivos tanto el txt como el apk en sitios diferentes, tanto en la interna como en la SD externa, raro raro raro.

B4X:
#Region  Project Attributes
    #ApplicationLabel: txt
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim List1 As List
      Dim label1  As Label
      Dim label2  As Label
      Dim BotonOk As Button
      Dim Dato1 As String
      Dim Dato2 As String
      Dim DatosOk As Boolean
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("txt")
    List1.Initialize
    List1.Add(0)
    List1.Add(1)

    LeerFichero

    If DatosOk  Then
        label1.Text=Dato1
        label2.Text=Dato2
      ' SI existen datos, representarlos o hacer lo que quieras
    Else
        Msgbox("No hay datos","LEER")
      ' NO existen datos guardados, llamar a introducir datos
    End If

'    ' tambien puedes hacer esto para verificar los datos
'    If Dato1 = "" AND Dato2 = "" Then
'        ' NO existen datos guardados, llamar a introducir datos
'    Else
'        ' SI existen datos, representarlos o hacer lo que quieras
'    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub BotonOK_Click
  Dato1=label1.Text
  Dato2=label2.Text
  GrabarFichero
End Sub

Sub GrabarFichero()
  List1.Clear
  List1.Add(Dato1)
  List1.Add(Dato2)
  Try
        File.WriteList(File.DirDefaultExternal,"coordenadas.txt", List1)
  Catch
        Log("Error al escribir fichero Coordenadas.txt")
  End Try
End Sub

Sub LeerFichero()

  If File.Exists(File.DirDefaultExternal, "coordenadas.txt") Then
    List1 = File.ReadList(File.DirDefaultExternal, "coordenadas.txt")
    Dato1 = List1.Get(0)
    Dato2 = List1.Get(1)
    DatosOk = True'
    Msgbox("Hay datos","Cargando")
  Else
    Dato1 = ""
    Dato2 = ""
    DatosOk = False
    Msgbox("No hay datos","Cargando")
  End If
End Sub

Gracias a todos
Saludos
Pepe
 

cuellar

Member
Licensed User
Longtime User
Hola Pepe, recapitulemos...

Según tu primer post, el objetivo es recopilar coordenadas de varios lugares (supongo que con el GPS del móvil y no escribiendolas). En este punto ya debes tener en cuenta que son varios registros y no uno, cosa que en el código que pones no está tratado. La función de este código siempre reescribe el archivo, por tanto a la segunda vez que pulsas el botón te genera datos en blanco y por consiguiente un archivo vacio, por eso te funciona "a medias". En realidad el codigo funciona bien siempre, lo que pasa es que sencillamente no controlas los valores de las variables en el momento de registrarlas, siempre debes confirmar y comprobar que los datos sean del tipo correcto.

Por otro lado, has optado por un archivo de texto en lugar de base de datos, esto está bien, siempre que tomes en consideración algunos aspectos tales como el tamaño del archivo, la seguridad, y otros...Hace muuucho tiempo que no uso Access, pero creo recordar que tiene una herramienta para tomar datos desde ficheros de texto plano si le indicas el formato, es decir el tamaño de cada campo, si cada campo está separado por comillas, coma o guión, etc.

He modificado un poco el código y te he escrito una función para que los registros no se pisen cuando los grabes, y crea una linea por registro. He borrado la función de lectura porque no creo que te haga falta, si lo que vas a hacer es pasar el archivo al PC de la oficina.

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
   
   
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
     
      Dim Latitud As EditText
      Dim Longitud As EditText
      Dim Fecha As EditText
      Dim Hora As EditText
      Dim LatCoor As String
      Dim LonCoor As String
      Dim FechaCoor As String
      Dim HoraCoor As String
      Dim BotonOk As Button
     
      Dim Registro As TextWriter

End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("layout1")
       
End Sub

Sub Activity_Resume
   
   
End Sub

Sub Activity_Pause (UserClosed As Boolean)
   
End Sub

Sub BotonOK_Click
  LatCoor = Latitud.Text
  LonCoor = Longitud.Text
  FechaCoor = Fecha.Text
  HoraCoor = Hora.Text
 
  If Latitud.Text = "" Then
      LatCoor = "Null"
  End If
  If Longitud.Text = "" Then
      LonCoor = "Null"
  End If
  If Fecha.Text = "" Then
      FechaCoor = DateTime.Date(DateTime.Now)
  End If
  If Hora.Text = "" Then
      HoraCoor = DateTime.Time(DateTime.Now)
  End If
  Try
      GrabarFicheroVer2(FechaCoor,HoraCoor,LatCoor,LonCoor)
    Latitud.Text = ""
      Longitud.Text = ""
      Fecha.Text = ""
      Hora.Text = ""
      Latitud.RequestFocus
  Catch
      ToastMessageShow("Error al registrar en el archivo",True)
  End Try
 
End Sub
Sub GrabarFicheroVer2(FechaCoord As String, HoraCoord As String, Lat As String, Lon As String)
   
    Registro.Initialize(File.OpenOutput(File.DirRootExternal,"coordenadas.txt",True))
    Registro.WriteLine(FechaCoord & "," & HoraCoord & "," & Lat & "," & Lon)
    Registro.Close
   
   
End Sub

He puesto los EditText para simular la entrada de las coordenadas manualmente, esto tendrías que cambiarlo por las variables que obtengas del GPS.
Pruébalo y ya me dices.


Y perdona si me he enrollado demasiado, jejeje
Un saludo
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pepe:

No te preocupes por que tardes en tu respuesta, cada uno tenemos cosas que hacer y no siempre podemos entrar al foro.

Voy a entrar solo en el motivo de por que no te funciona el codigo de prueba que has hecho, de esa forma, al comprender el motivo podras luego hacer el codigo que tu quieras.
En definitiva, lo que pretendo es que entiendas el error desde su origen, por que asi podras resolverlo. Si te pegan un tiro en un pie y te tomas un calmante, se te pasará el dolor mientras dure el efecto del calmante, pero luego seguiras teniendo dolor. Si sacas la bala y curas la herida el dolor desaparecerá ;). Hoy dia con las prisas olvidamos que para resolver un problema tenemos que ir a su origen, si intentamos “poner parches” no lograremos resolver el problema definitivamente.

La solución que te da Cuellar es buena para lo que buscabas en un principio, pero pienso que si te digo donde has cometido el error te valdrá para el futuro.

Hace años, cuando se estudiaba programación a nivel máquina o ensamblador :rolleyes: y no tenias las herramientas de desarrollo que existen ahora, depurar un programa era complejo, entonces lo que haciamos era tener una lista de las variables con sus valores, y conforme se iban modificando ponias sus nuevos valores, esto ahora lo puedes hacer con el debug (rapid)

Bien, después de todo este rollo :D, empecemos a ver que pasa con el programa.

- Entra en el Activity_Create e inicializa el List1
- Va a leer el fichero
Como no existe te da el mensaje y pone las variables:
Dato1 = ""
Dato2 = ""
DatosOk = False


- Pulsas el boton de grabar y pones las variables:
Dato1=Label1.Text
Dato2=Label2.Text


Si en diseño no le has dado ningun valor, Label1 y Label2, Dato1 y Dato2 estan vacias.

- Manda a grabar el fichero
- Resetea la lista (List1.Clear), y pone el valor de las variables Dato1 y Dato2 en la lista.

Que ha grabado aquí? nada, dos cadenas vacias. Si miras el fichero, este existe y contiene dos 0A en Hexadecimal, Line Feed (avance de linea)

Como tu dices, solo te funciona a medias si copio los ficheros.
Cuando tu copias los ficheros y entras la primera vez, el programa lee esos datos y te dice que hay datos, pero al darle al boton de grabar pasa lo que hemos visto en la secuencia anterior, que lo graba con cadenas vacias por que no hay datos para grabar.

Conclusión, el programa funciona pero como las etiquetas label1 y label2 estan sin texto no graba nada. Cambialas por EditText1 y EditText2 y cambia en el boton de grabar el Dato1=Label1.Text y Dato2=Label2.Text por Dato1=EditTex1.Text y Dato2=EditTex2.Text, y pon datos dentro antes de darle al boton de grabar y veras como se conservan los datos.

Por otro lado, el ejemplo que le puse a Casan79 era especifico de lo que el queria y ya comenté que hay mil formas de resolverlo, asi que como dice Cuellar los datos cada vez que das a grabar se machacan. Si no quieres que ocurra esto, puedes eliminar (o comentar) el List1.Clear del GrabarFichero y los datos te los irá grabando a continuación unos detrás del otro, o empleas la opcion que te da Cuellar, lo que a ti te guste mas.

Si eliminas el List1.Clear prueba de ir poniendo datos nuevos en EditTex1 y EditTex2 y veras como en el fichero se graban secuencialmente.

Espero haberte ayudado

Saludos
 

23021959Pepe

Member
Licensed User
Longtime User
Gracias a los dos por vuestras explicaciones. he probado el código de cuellar, que era lo que yo quería hacer y funciona perfectamente.
Cuando uno explica lo que sabe, a otro que tiene interés en aprender, nunca es ningún ROLLO.
Voy a seguir abusando de vuestros conocimientos, ¿por que con el explorador de Windows no consigo ver los archivos txt que hay en el Almacenamiento interno (adjunto imagen) de la tarjeta y sin embargo con el ES File Explorer del móvil si consigo verlos?, este era uno de los motivos que me estaba despistando, al no ver donde se guardaba el archivo txt.
Como no domino lo de insertar imagen, no se si se vera.

Saludos de nuevo y gracias
Pepe
 

Attachments

  • upload_2013-10-22_18-57-32.png
    upload_2013-10-22_18-57-32.png
    137.7 KB · Views: 407

cuellar

Member
Licensed User
Longtime User
Deberías verlo sin problemas, quizás conectas el movil en tipo de conexión "Sincronizar" o "Solo cargar". Debes buscar la opción "Unidad de disco" o algo similar. O bien extraer la tarjeta SD y usar un lector de tarjetas en el PC, pero ya te digo, no deberías tener problemas. También puede ser que el archivo no exista o que esté ubicado en otras carpetas.

Edito:
Si has usado File.DirDefaultExternal debes buscar en Android/data/<nombre de paquete>/files/coordenadas.txt

Si has usado File.DirRootExternal debes buscar en la raiz de la tarjeta SD
 
Last edited:

23021959Pepe

Member
Licensed User
Longtime User
Hola cuellar, la verdad es que no me lo explico como se pueden ver unos tipos de archivos y otros no.Intentare buscar por la red este problema. Existir existen, porque como dije antes con el ES File Explorer del móvil si los veo.

Saludos
Pepe
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Pepe

Puede deberse a dos cosas el que no lo veas, que en la configuracion de archivos de windows no tengas puesto que puedas ver todo tipo de archivos, y la mas probable es que si abres primero el explorador de windows y luego creas el archivo, windows no refresca las carpetas del movil, a mi esto me pasó y tambien me volvia loco pensando que no existia el fichero, hasta que se me ocurrió mirarlo con el Total Commander (administrador de archivos) desde el movil y vi que si existia, salí del explorador de windows y volvi a entrar :D y entonces si que lo refrescaba. Increiblemente windows refresca las carpetas de los discos duros locales, usb, etc, pero no las del movil (al menos me pasa a mi con Windows XP Professional)

En windows tambien tengo instalado el Total Comander, y ahora salió un plugin adb y ya no empleo el explorador de windows, lo hago entrando en el adb que te muestra todos los dispositivos que tienes conectados incluso el emulador del movil en windows ;) .

El Total Commander para windows y movil puedes bajartelo aqui http://www.ghisler.com
El plugin para windows está aqui: http://www.totalcmd.net/plugring/android_adb.html



Saludos
 

23021959Pepe

Member
Licensed User
Longtime User
Pues si Jesús, misterios de la tecnología. Esta tarde he conectado el móvil al PC y entonces me aparecen los archivos que ayer no conseguía ver pero que sabia que estaban ahí.
Tendré en cuenta para la próxima vez lo del Total Commander.
Cuando termine de hacer unos ajustes en el programa y si no doy con la tela, abriré un nuevo hilo para que me orientéis y así de paso que sirva para otros que tengan las mismas dudas que yo.

Saludos
 
Top