#PB_Localstorage seems not to work

Just starting out? Need help? Post your questions and find answers here.
AMpos
Posts: 44
Joined: Mon Aug 03, 2020 5:15 pm

#PB_Localstorage seems not to work

Post by AMpos »

why doesnt work this code?

Code: Select all

Procedure Callback(Status, Filename$, File, SizeRead)
    Select Status
      Case #PB_Status_Saved
        ; File correctly saved
        
      Case #PB_Status_Error
        ; File saving has failed
    EndSelect
  EndProcedure

  If CreateFile(0, "Text.txt", @Callback(),#PB_LocalStorage)      ; we create a new text file
    For a=1 To 10
      WriteStringN(0, "TEST")
    Next
;     ExportFile(0, "text/plain")
    CloseFile(0)                      
  EndIf
  
  ReadFile(0,"Text.txt",@Callback(),#PB_LocalStorage)
  Debug ReadString(0)
  CloseFile(0)
User avatar
Peter
Posts: 1206
Joined: Mon Feb 24, 2014 10:17 pm
Location: 127.0.0.1:9080
Contact:

Re: #PB_Localstorage seems not to work

Post by Peter »

you can only read the file after it has been saved:

Code: Select all

EnableExplicit

Procedure ReadFileCallback(Status, Filename$, File, Size)
  
  Protected a
  
  Select Status
      
    Case #PB_Status_Loaded
      
      Debug "#PB_Status_Loaded"
      
      For a = 1 To 10
        Debug ReadString(0)
      Next
      
      CloseFile(0)
      
    Case #PB_Status_Error
      
      Debug "#PB_Status_Error"
      
  EndSelect
  
EndProcedure

Procedure CreateFileCallback(Status, Filename$, File, SizeRead)
  
  Select Status
      
    Case #PB_Status_Saved
      
      Debug "#PB_Status_Saved"
      
      ReadFile(0, "Text.txt", @ReadFileCallback(), #PB_LocalStorage) ; <- here!
      
    Case #PB_Status_Error
      
      Debug "#PB_Status_Error"
      
  EndSelect
  
EndProcedure

Define a

If CreateFile(0, "Text.txt", @CreateFileCallback(), #PB_LocalStorage)
  
  For a = 1 To 10
    WriteStringN(0, "TEST" + Str(a))
  Next
  
  CloseFile(0)
  
EndIf
Greetings ... Peter
KianV
Posts: 21
Joined: Sun Nov 17, 2019 11:38 am

Re: #PB_Localstorage seems not to work

Post by KianV »

Peter wrote:you can only read the file after it has been saved
This took me a while to get my head around too.
The file operations run out of sync with the top-to-bottom flow of your program.
If you put a couple of 'Debug' statements in your original code :

Code: Select all

Procedure Callback(Status, Filename$, File, SizeRead)
    Select Status
      Case #PB_Status_Saved
        ; File correctly saved
       Debug "The file is now saved"      ;HERE
      Case #PB_Status_Error
        ; File saving has failed
    EndSelect
  EndProcedure

  If CreateFile(0, "Text.txt", @Callback(),#PB_LocalStorage)      ; we create a new text file
    For a=1 To 10
      WriteStringN(0, "TEST")
    Next
;     ExportFile(0, "text/plain")
    CloseFile(0)                     
  EndIf
 
  Debug "Now read the file"             ; AND HERE
  ReadFile(0,"Text.txt",@Callback(),#PB_LocalStorage)
  Debug ReadString(0)
  CloseFile(0)
you will see that it starts to 'Read' the file before it has finished the 'Save' operation, which is still going on in the background.
Hence the need for Callback routines.

As always, Peter's example shows you how to do it properly.
AMpos
Posts: 44
Joined: Mon Aug 03, 2020 5:15 pm

Re: #PB_Localstorage seems not to work

Post by AMpos »

I'm having a hard time with this...

I got it working ith Fred code... but with a single output/input file. I place my readstrings loop inside the readfilecallback() and it works but...

the problem is that my original code wants to write and read 7 files (each file has a player name and scores). And I can not have it working.

Something like this:

Code: Select all

Dim name$(7)

Procedure Callback(Status, Filename$, File, SizeRead)
    Select Status
      Case #PB_Status_Saved
        ; File correctly saved
       
      Case #PB_Status_Error
        ; File saving has failed
    EndSelect
    
EndProcedure

For j=0 To 7
  If CreateFile(0, "p"+Str(j), @Callback(),#PB_LocalStorage)      ; we create a new text file
    WriteStringN(0, "Player Name "+Str(j))
    ;write scores blah blah blah
    CloseFile(0)                     
  EndIf
Next

For j=0 To 7
  ReadFile(0,"p"+Str(j),@Callback(),#PB_LocalStorage)
  name$(j)=ReadString(0):Debug name$(j)
  ;read scores blah blah blah
  CloseFile(0)
Next

PS: I know it is not working. This code is just "what I want to do", not "how to do it"

The idea is that my program will save all the player names and scores every time they change, so if the browser crash or the app reloads, it will start reading the last saved player names and scores, to continue were it was left:

Code: Select all

START:  PSEUDO CODE
readscores()
fillscreen()
repeat ;main loop
  if score=change
   savesccores():fillscreen()
  endif
forever

Last edited by AMpos on Thu Aug 13, 2020 11:32 pm, edited 1 time in total.
User avatar
Peter
Posts: 1206
Joined: Mon Feb 24, 2014 10:17 pm
Location: 127.0.0.1:9080
Contact:

Re: #PB_Localstorage seems not to work

Post by Peter »

Although I don't understand why you want to save data for seven players in a single browser session:
You can save the data for these seven players in a single file. There is no need to create seven files.
AMpos
Posts: 44
Joined: Mon Aug 03, 2020 5:15 pm

Re: #PB_Localstorage seems not to work

Post by AMpos »

Because sometimes, if you open another program/tab on your mobile, when you come back to your previous tab, it is loaded again, so scores will be lost.

I "can not" record all of this in a single file because I dont know how many scores has each player.

You can see my program here:

https://www.frikland.com/sb/CVC.htm

BTW, tonite I made a bingo :)

https://www.frikland.com/sb/bingo.htm
User avatar
Peter
Posts: 1206
Joined: Mon Feb 24, 2014 10:17 pm
Location: 127.0.0.1:9080
Contact:

Re: #PB_Localstorage seems not to work

Post by Peter »

Alternatively you can use my Preferences module, which is operated exactly like in PureBasic: https://github.com/spiderbytes/Preferences
AMpos
Posts: 44
Joined: Mon Aug 03, 2020 5:15 pm

Re: #PB_Localstorage seems not to work

Post by AMpos »

Peter wrote:Alternatively you can use my Preferences module, which is operated exactly like in PureBasic: https://github.com/spiderbytes/Preferences
I will give it a shot. Thank you.
KianV
Posts: 21
Joined: Sun Nov 17, 2019 11:38 am

Re: #PB_Localstorage seems not to work

Post by KianV »

AMpos wrote:I "can not" record all of this in a single file because I dont know how many scores has each player.
Could you not just write out each score accompanied by a byte with the player number?
The player names could also be held in the file as strings.

Code: Select all

PSEUDOCODE:

CreateFile

For j=0 To 6
WriteStringN(playername$(j)
Next j

For j=1 to numberofscores
WriteByte(playernumber)
WriteWord(scorevalue)
Next j

CloseFile
The data could then be read back in a similar fashion.

Alternatively you could record a byte for each player to say how many scores are recorded, giving a file in the form:

#player1name$ #howmanyscoresforP1 #P1score1 #P1score2 #P1score3 ........ #player2name$ #howmanyscoresforP2 #P2score1 #P2score2 #P2score3 ...
Post Reply