Creating Apps for use on Android mobile phones
Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller, robinmiller
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
I have made the inclusions and ensured that the following are checked:
Navigation Bar : DataGrid : Sqlite : Database : Answer Dialog : Ask Dialog
I am still obviously missing something here. As I found that the app works great in the LiveCode Environment but the buttons will not work when in the emulator or on my mobile phone.
Navigation Bar : DataGrid : Sqlite : Database : Answer Dialog : Ask Dialog
I am still obviously missing something here. As I found that the app works great in the LiveCode Environment but the buttons will not work when in the emulator or on my mobile phone.
Re: Creating Apps for use on Android mobile phones
Can you put some scripts of the buttons here, so we can take a look what is happening?
Or a test stack ?
Or a test stack ?
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
Please find below (1) Code of the Stack; (2) Code of the Card; (3) Code of the Buttons Used;
Code of the Main Stack
global gConnID, gHomeFolder
on preOpenStack
set the enabled of button "Login" to true
put the effective filename of this stack into gHomeFolder
set the itemDelimiter to slash
put item 1 to -2 of gHomeFolder into gHomeFolder
set the defaultFolder to gHomeFolder
disable widget "navbar"
connectToDB
end preOpenStack
on openStack
set the fullscreenmode of stack "dbMembershipSuite" to "exactFit"
end openStack
on closeStack
databaseDisconnect
end closeStack
on connectToDB
local tDatabasePath, tDatabaseID
put "membershipdatabase.db" into tDatabasePath
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
setDatabaseID tDatabaseID
end connectToDB
command setDatabaseID pDatabaseID
put pDatabaseID into gConnID
end setDatabaseID
function getDatabaseID
return gConnID
end getDatabaseID
command databaseDisconnect
local tResult
revCloseDatabase gConnID
put the result into tResult
handleRevDBerror tResult
if the result is not empty then
answer warning the result
exit to top
end if
answer information "Connection Terminated"
end databaseDisconnect
on handleRevDBerror p
switch
case item 1 of p is "revdberr"
return "revDB Error:" & p
break
case "syntax error" is in p
return "Database Error:" & p
break
end switch
end handleRevDBerror
on showAllRecords
local tQuery, tRecords
connectToDB
show group "dgMembersList"
put "SELECT * FROM members" into tQuery
put revDataFromQuery(,,gConnID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
databaseDisconnect gConnID
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end showAllRecords
Code of the Card
global gConnID
on openCard
set the enabled of button "MembersPaid" to true
set the enabled of button "MembersDue" to true
set the enabled of button "MembersList" to true
enable widget "navbar"
showAllRecords
end openCard
on resizeStack x,y
local tRowSize
put 60 into tRowSize
-- Header - fixed height, full bleed:
set the rect of btn "header" to 0,0,x, tRowSize
-- Content Region
set the rect of grp "ContentRegion" to 0, tRowSize, x, y-tRowSize
-- Footer - fixed height, full bleed:
set the rect of widget "NavBar" to 0,y-tRowSize,x,y
end resizeStack
Code of the 'Members Paid" Button
global gConnID
on mouseUp
local tQuery, tRecords, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'Yes'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members Due' Button
global gConnID
on mouseUp
local tRecords, tQuery, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'No'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members List' Button
on mouseUp
showAllRecords
end mouseUp
Code for the 'mouseUp' when clicking on a members name shown on the Datagrid
global gConnID,gRecordID, gFname,gLname,gAddr1,gAddr2,gAddr3,gAddr4,gPostcode,gTelephone,gMobile,gEmail,gDate,gFee,gPaid,gType
on mouseUp
local tLineSelected
put the dgHilitedLine of group "dgMembersList" into tLineSelected
if tLineSelected is a number and tLineSelected>0 then
set the itemDelimiter to tab
put item 1 of line tLineSelected of the dgText of group "dgMembersList" into gRecordID
put item 2 of line tLineSelected of the dgText of group "dgMembersList" into gFname
put item 3 of line tLineSelected of the dgText of group "dgMembersList" into gLname
put item 4 of line tLineSelected of the dgText of group "dgMembersList" into gAddr1
put item 5 of line tLineSelected of the dgText of group "dgMembersList" into gAddr2
put item 6 of line tLineSelected of the dgText of group "dgMembersList" into gAddr3
put item 7 of line tLineSelected of the dgText of group "dgMembersList" into gAddr4
put item 8 of line tLineSelected of the dgText of group "dgMembersList" into gPostcode
put item 9 of line tLineSelected of the dgText of group "dgMembersList" into gDate
put item 10 of line tLineSelected of the dgText of group "dgMembersList" into gFee
put item 11 of line tLineSelected of the dgText of group "dgMembersList" into gPaid
put item 12 of line tLineSelected of the dgText of group "dgMembersList" into gType
put item 13 of line tLineSelected of the dgText of group "dgMembersList" into gTelephone
put item 14 of line tLineSelected of the dgText of group "dgMembersList" into gMobile
put item 15 of line tLineSelected of the dgText of group "dgMembersList" into gEmail
visual effect "push" left fast
go to card "selected member"
end if
end mouseUp
Code for the Widget 'NavBar'
on hiliteChanged
global gMenuName
get the hilitedItemName of widget "navbar"
go to card it
// set the hilitedItemName of widget "navbar" to gMenuName
set the hilitedItemName of widget "navbar" to it
end hiliteChanged
Thanks
Code of the Main Stack
global gConnID, gHomeFolder
on preOpenStack
set the enabled of button "Login" to true
put the effective filename of this stack into gHomeFolder
set the itemDelimiter to slash
put item 1 to -2 of gHomeFolder into gHomeFolder
set the defaultFolder to gHomeFolder
disable widget "navbar"
connectToDB
end preOpenStack
on openStack
set the fullscreenmode of stack "dbMembershipSuite" to "exactFit"
end openStack
on closeStack
databaseDisconnect
end closeStack
on connectToDB
local tDatabasePath, tDatabaseID
put "membershipdatabase.db" into tDatabasePath
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
setDatabaseID tDatabaseID
end connectToDB
command setDatabaseID pDatabaseID
put pDatabaseID into gConnID
end setDatabaseID
function getDatabaseID
return gConnID
end getDatabaseID
command databaseDisconnect
local tResult
revCloseDatabase gConnID
put the result into tResult
handleRevDBerror tResult
if the result is not empty then
answer warning the result
exit to top
end if
answer information "Connection Terminated"
end databaseDisconnect
on handleRevDBerror p
switch
case item 1 of p is "revdberr"
return "revDB Error:" & p
break
case "syntax error" is in p
return "Database Error:" & p
break
end switch
end handleRevDBerror
on showAllRecords
local tQuery, tRecords
connectToDB
show group "dgMembersList"
put "SELECT * FROM members" into tQuery
put revDataFromQuery(,,gConnID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
databaseDisconnect gConnID
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end showAllRecords
Code of the Card
global gConnID
on openCard
set the enabled of button "MembersPaid" to true
set the enabled of button "MembersDue" to true
set the enabled of button "MembersList" to true
enable widget "navbar"
showAllRecords
end openCard
on resizeStack x,y
local tRowSize
put 60 into tRowSize
-- Header - fixed height, full bleed:
set the rect of btn "header" to 0,0,x, tRowSize
-- Content Region
set the rect of grp "ContentRegion" to 0, tRowSize, x, y-tRowSize
-- Footer - fixed height, full bleed:
set the rect of widget "NavBar" to 0,y-tRowSize,x,y
end resizeStack
Code of the 'Members Paid" Button
global gConnID
on mouseUp
local tQuery, tRecords, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'Yes'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members Due' Button
global gConnID
on mouseUp
local tRecords, tQuery, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'No'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members List' Button
on mouseUp
showAllRecords
end mouseUp
Code for the 'mouseUp' when clicking on a members name shown on the Datagrid
global gConnID,gRecordID, gFname,gLname,gAddr1,gAddr2,gAddr3,gAddr4,gPostcode,gTelephone,gMobile,gEmail,gDate,gFee,gPaid,gType
on mouseUp
local tLineSelected
put the dgHilitedLine of group "dgMembersList" into tLineSelected
if tLineSelected is a number and tLineSelected>0 then
set the itemDelimiter to tab
put item 1 of line tLineSelected of the dgText of group "dgMembersList" into gRecordID
put item 2 of line tLineSelected of the dgText of group "dgMembersList" into gFname
put item 3 of line tLineSelected of the dgText of group "dgMembersList" into gLname
put item 4 of line tLineSelected of the dgText of group "dgMembersList" into gAddr1
put item 5 of line tLineSelected of the dgText of group "dgMembersList" into gAddr2
put item 6 of line tLineSelected of the dgText of group "dgMembersList" into gAddr3
put item 7 of line tLineSelected of the dgText of group "dgMembersList" into gAddr4
put item 8 of line tLineSelected of the dgText of group "dgMembersList" into gPostcode
put item 9 of line tLineSelected of the dgText of group "dgMembersList" into gDate
put item 10 of line tLineSelected of the dgText of group "dgMembersList" into gFee
put item 11 of line tLineSelected of the dgText of group "dgMembersList" into gPaid
put item 12 of line tLineSelected of the dgText of group "dgMembersList" into gType
put item 13 of line tLineSelected of the dgText of group "dgMembersList" into gTelephone
put item 14 of line tLineSelected of the dgText of group "dgMembersList" into gMobile
put item 15 of line tLineSelected of the dgText of group "dgMembersList" into gEmail
visual effect "push" left fast
go to card "selected member"
end if
end mouseUp
Code for the Widget 'NavBar'
on hiliteChanged
global gMenuName
get the hilitedItemName of widget "navbar"
go to card it
// set the hilitedItemName of widget "navbar" to gMenuName
set the hilitedItemName of widget "navbar" to it
end hiliteChanged
Thanks
Re: Creating Apps for use on Android mobile phones
For the sake of better readable here on the forum ,please put your code like this .
That's where the this </> button here on the forum is for.
What happens if you just say: answer tRecords
and probably you need to use: revExecuteSQL
else nothing is happening.
i Use something like this with sqlite
Code: Select all
your button code here
That's where the this </> button here on the forum is for.
What happens if you just say: answer tRecords
and probably you need to use: revExecuteSQL
else nothing is happening.
i Use something like this with sqlite
Code: Select all
put "SELECT * FROM cust WHERE id=1" into tSQL
put revDataFromQuery(tab,return,gLocalDbID,tSQL) into tCustGeg
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
Code: Select all
Code of the Main Stack
global gConnID, gHomeFolder
on preOpenStack
set the enabled of button "Login" to true
put the effective filename of this stack into gHomeFolder
set the itemDelimiter to slash
put item 1 to -2 of gHomeFolder into gHomeFolder
set the defaultFolder to gHomeFolder
disable widget "navbar"
connectToDB
end preOpenStack
on openStack
set the fullscreenmode of stack "dbMembershipSuite" to "exactFit"
end openStack
on closeStack
databaseDisconnect
end closeStack
on connectToDB
local tDatabasePath, tDatabaseID
put "membershipdatabase.db" into tDatabasePath
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
setDatabaseID tDatabaseID
end connectToDB
command setDatabaseID pDatabaseID
put pDatabaseID into gConnID
end setDatabaseID
function getDatabaseID
return gConnID
end getDatabaseID
command databaseDisconnect
local tResult
revCloseDatabase gConnID
put the result into tResult
handleRevDBerror tResult
if the result is not empty then
answer warning the result
exit to top
end if
answer information "Connection Terminated"
end databaseDisconnect
on handleRevDBerror p
switch
case item 1 of p is "revdberr"
return "revDB Error:" & p
break
case "syntax error" is in p
return "Database Error:" & p
break
end switch
end handleRevDBerror
on showAllRecords
local tQuery, tRecords
connectToDB
show group "dgMembersList"
put "SELECT * FROM members" into tQuery
put revDataFromQuery(,,gConnID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
databaseDisconnect gConnID
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end showAllRecords
Code of the Card
global gConnID
on openCard
set the enabled of button "MembersPaid" to true
set the enabled of button "MembersDue" to true
set the enabled of button "MembersList" to true
enable widget "navbar"
showAllRecords
end openCard
on resizeStack x,y
local tRowSize
put 60 into tRowSize
-- Header - fixed height, full bleed:
set the rect of btn "header" to 0,0,x, tRowSize
-- Content Region
set the rect of grp "ContentRegion" to 0, tRowSize, x, y-tRowSize
-- Footer - fixed height, full bleed:
set the rect of widget "NavBar" to 0,y-tRowSize,x,y
end resizeStack
Code of the 'Members Paid" Button
global gConnID
on mouseUp
local tQuery, tRecords, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'Yes'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members Due' Button
global gConnID
on mouseUp
local tRecords, tQuery, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put "SELECT * FROM members WHERE paid = 'No'" into tQuery
put revDataFromQuery(,,tDatabaseID, tQuery) into tRecords
if tRecords begins with "revdberr" then
answer error "There was a problem accessing the Database: " & tRecords
exit to top
end if
set the dgText of group "dgMembersList" to tRecords
end mouseUp
Code for the 'Members List' Button
on mouseUp
showAllRecords
end mouseUp
Code for the 'mouseUp' when clicking on a members name shown on the Datagrid
global gConnID,gRecordID, gFname,gLname,gAddr1,gAddr2,gAddr3,gAddr4,gPostcode,gTelephone,gMobile,gEmail,gDate,gFee,gPaid,gType
on mouseUp
local tLineSelected
put the dgHilitedLine of group "dgMembersList" into tLineSelected
if tLineSelected is a number and tLineSelected>0 then
set the itemDelimiter to tab
put item 1 of line tLineSelected of the dgText of group "dgMembersList" into gRecordID
put item 2 of line tLineSelected of the dgText of group "dgMembersList" into gFname
put item 3 of line tLineSelected of the dgText of group "dgMembersList" into gLname
put item 4 of line tLineSelected of the dgText of group "dgMembersList" into gAddr1
put item 5 of line tLineSelected of the dgText of group "dgMembersList" into gAddr2
put item 6 of line tLineSelected of the dgText of group "dgMembersList" into gAddr3
put item 7 of line tLineSelected of the dgText of group "dgMembersList" into gAddr4
put item 8 of line tLineSelected of the dgText of group "dgMembersList" into gPostcode
put item 9 of line tLineSelected of the dgText of group "dgMembersList" into gDate
put item 10 of line tLineSelected of the dgText of group "dgMembersList" into gFee
put item 11 of line tLineSelected of the dgText of group "dgMembersList" into gPaid
put item 12 of line tLineSelected of the dgText of group "dgMembersList" into gType
put item 13 of line tLineSelected of the dgText of group "dgMembersList" into gTelephone
put item 14 of line tLineSelected of the dgText of group "dgMembersList" into gMobile
put item 15 of line tLineSelected of the dgText of group "dgMembersList" into gEmail
visual effect "push" left fast
go to card "selected member"
end if
end mouseUp
Code for the Widget 'NavBar'
on hiliteChanged
global gMenuName
get the hilitedItemName of widget "navbar"
go to card it
// set the hilitedItemName of widget "navbar" to gMenuName
set the hilitedItemName of widget "navbar" to it
end hiliteChanged
answer tRecords displays the data as expected and neatly placed tabbed out
I also replaced the lines with your suggestion which gave the same results as mine did.
I have ensured that the General Tab, the Stacks tab, inclusion tabs and Android tabs are containing the relevant information as previously suggested.
I feel that I am taking up everyones time who offered help and yet I can still not resolve the problem of the buttons working within the LiveCode Environment but not working within the emulator or Android phone.
Thanks
Re: Creating Apps for use on Android mobile phones
did you try this also on a phone or the emulator? Does it answer then?
i'm going to put it in a stack and see what happens on my test phone
edit
where is the part that you actually create the DB file and insert data?
i'm going to put it in a stack and see what happens on my test phone
edit
where is the part that you actually create the DB file and insert data?
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
The 'connectToDB' routine can be found in the stack code and is called via 'onPreOpenStack' routine. The whole project only has one stack and five additional cards.
The routine for saving the data to the database can be found on the 'newmembers' card where the end user would fill in the details required and then selecting the 'Save' button. The script for that button is:
I have tested the project within the LiveCode Environment. All works well with opening the database and successfully saving the data and then displaying the saved data. I can even delete the record from the database, amend the record on the database even search the database for a specific record. As I said the whole project works well and performs as expected when testing within the LiveCode Environment.
The problem is that when I test the project, either on the emulator or by downloading the .apk file to my Android Phone. The navigation bar works well and allows me to move from card to card. But ALL the other buttons on the different cards, when selected DO NOTHING. So I cannot 'Save' a new record to the database.
When I created the standalone I did ensure that I added the image files, the database file, and the text file which holds the membership fees. I also ensured that I selected the 'Inclusions' such as Database, SQLite, Datagrid, Navigation Bar.
I hope this extra information which assist.
Regards
Code: Select all
on connectToDB
local tDatabasePath, tDatabaseID
put "membershipdatabase.db" into tDatabasePath
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
setDatabaseID tDatabaseID
end connectToDB
command setDatabaseID pDatabaseID
put pDatabaseID into gConnID
end setDatabaseID
Code: Select all
global gConnID
on mouseUp
local tRowData, tSQL, tResult, tDatabaseID
connectToDB
put gConnID into tDatabaseID
put field "txtFname" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtLname" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtAddr1" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtAddr2" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtAddr3" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtAddr4" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtPostcode" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtDate" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtFee" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtPaid" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put the label of button "optMembership" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtTelephone" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtMobile" into it
put "'" & cleanSQL(it) & "'" & "," after tRowData
put field "txtEmail" into it
put "'" & cleanSQL(it) & "'" after tRowData
put "INSERT INTO members (member_id,fname,lname,addr1,addr2,addr3,addr4,postcode,joindate,fee,paid,membership,phone,mobile,email) " & "VALUES(null," & tRowData & ")" into tSQL
revExecuteSQL tDatabaseID, tSQL
put the result into tResult
handleRevDBerror tResult
if the result is not empty then
answer warning the result
exit to top
end if
answer information "Membership Details Saved!" titled "Stephen R Lucas"
send "mouseUp" to button "Cancel Entry"
end mouseUp
function cleanSQL pSQL
replace "'" with "''" in pSQL
replace quote with quote & quote in pSQL
replace return with "*RETURN*" in pSQL
replace tab with "*TAB*" in pSQL
return pSQL
end cleanSQL
The problem is that when I test the project, either on the emulator or by downloading the .apk file to my Android Phone. The navigation bar works well and allows me to move from card to card. But ALL the other buttons on the different cards, when selected DO NOTHING. So I cannot 'Save' a new record to the database.
When I created the standalone I did ensure that I added the image files, the database file, and the text file which holds the membership fees. I also ensured that I selected the 'Inclusions' such as Database, SQLite, Datagrid, Navigation Bar.
I hope this extra information which assist.
Regards
Re: Creating Apps for use on Android mobile phones
Hi Dragondos2020,
a couple of things...
1. Location of your database file
Are you sure that the folder the app is in is the folder with your database?
I have no idea, but LC did take care of this!
You surely have added the db file via the "Copy files" tab in the "Standalone Application Settings" for your stack, right?
In that case you will find everything added there in -> specialfolderpath("resources") in your final app On ANY platform,
whereever that folder may be on the target platform.
So you will find your db file here:
2. We cannot open that database at that location!
Since we do not have write permission in that folder and even opening a database is considered writing on almost all operating systems.
Maybe that is the problem and the script just halts(s) at that point and nothing else works!?
So you need to copy the db file to the users documents folder where we have write permissions and actually use the db!
We add a little check if the db file is already there and copy it if not:
Please try and report back.
Best
Klaus
a couple of things...
1. Location of your database file
Code: Select all
on preOpenStack
set the enabled of button "Login" to true
## put the effective filename of this stack into gHomeFolder
## set the itemDelimiter to slash
## put item 1 to -2 of gHomeFolder into gHomeFolder
## set the defaultFolder to gHomeFolder
## NO need to se the defaultfolder!
disable widget "navbar"
connectToDB
end preOpenStack
I have no idea, but LC did take care of this!
You surely have added the db file via the "Copy files" tab in the "Standalone Application Settings" for your stack, right?
In that case you will find everything added there in -> specialfolderpath("resources") in your final app On ANY platform,
whereever that folder may be on the target platform.
So you will find your db file here:
Code: Select all
...
put specialfolderpath("resources") & "/membershipdatabase.db" into The_DB_File
...
Since we do not have write permission in that folder and even opening a database is considered writing on almost all operating systems.
Maybe that is the problem and the script just halts(s) at that point and nothing else works!?
So you need to copy the db file to the users documents folder where we have write permissions and actually use the db!
We add a little check if the db file is already there and copy it if not:
Code: Select all
## Global and local variables only need be declared ONCE at the top of the complete script!
global gConnID, gHomeFolder
local tDatabasePath, tDatabaseID
on preopenstack
##...
end preopenstack
## etc...
on connectToDB
## This folder is where we have write permission and we should store everything we need here
## like user settings, database, PDFs, screenshots etc... whatever your app outputs :-)
put specialfolderpath("documents") & "/membershipdatabase.db" into tDatabasePath
## Now check if the app has started the very first time = db file NOT (yet) present
## If not we copy the db
if there is NOT a file tDatabasePath then
## See above
put specialfolderpath("resources") & "/membershipdatabase.db" into tSourceFile
## Copy the file:
put url("binfile:" & tSourceFile) into url("binfile:" & tDatabasePath)
end if
## Green light, file present, ready to connect!
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
setDatabaseID tDatabaseID
end connectToDB
Best
Klaus
Re: Creating Apps for use on Android mobile phones
Hint:
specialfolderpath("resources") even works in the IDE, where it points to the folder with the current stack.
So you could script something like this to cover all cases (IDE and RUNTIME) in one script,
just put the db file into the folder with your stack, add it via "Copy files" to your final app and there you go:
## setDatabaseID tDatabaseID
That handler setDatabaseID is completely redundant, since tDatabaseID IS ALREADY A LOCAL and setting it
again, and even in a separate handler, is really ****CENSORED****! So just delete it.
Who on earth invented that?
A member of the "confuse-a-newbie" department?
specialfolderpath("resources") even works in the IDE, where it points to the folder with the current stack.
So you could script something like this to cover all cases (IDE and RUNTIME) in one script,
just put the db file into the folder with your stack, add it via "Copy files" to your final app and there you go:
Code: Select all
on connectToDB
## This folder is where we can work with the db
## Check if we are in the IDE:
if the environment = "development" then
put specialfolderpath("resources") & "/membershipdatabase.db" into tDatabasePath
## Folder where the stack is in, we may write here in the IDE!
else
## Runtime:
put specialfolderpath("documents") & "/membershipdatabase.db" into tDatabasePath
end if
## Now check if the app has started the very first time but only as the final runtime because of our check above!
## If not we copy the db
if there is NOT a file tDatabasePath then
put specialfolderpath("resources") & "/membershipdatabase.db" into tSourceFile
put url("binfile:" & tSourceFile) into url("binfile:" & tDatabasePath)
end if
## Green light, file present, ready to connect!
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
## setDatabaseID tDatabaseID
end connectToDB
That handler setDatabaseID is completely redundant, since tDatabaseID IS ALREADY A LOCAL and setting it
again, and even in a separate handler, is really ****CENSORED****! So just delete it.
Who on earth invented that?
A member of the "confuse-a-newbie" department?
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
Thank you for your assistance. I changed the stack code as suggested to :
Also changed the ConnectToDB Code as suggested:
I then run the project in the LiveCode Environment and watched its process. It chose the 'Development' option, as expected. Checked it was Not a file and found its way to the ## Green Light comments, where it successfully connected to the database and put 27 into the tDatabaseID. No warnings were given, so all was ok. When I moved on from the main screen the program did throw up a small problem as I had used gConnID. So once I rectified that the whole program worked perfectly
After saving as a standalone I then tested the program in the Android Emulator. When I accessed the Main Screen, whereas before when I selected any of the buttons (Members Paid, Members Due and Members List). Literally nothing would happen. However, this time when selecting any of the three buttons (Coding for which can be found previously within the Post and Replies). I receive the follow message: This is also the same message I get when my project moves from the first card to the second card. The second card being the main where the first card is the Login screen. The Login has not been coded yet.
There was a problem accessing the Database: rebdberr,Database Error: No such table: members
This to me appears to be at least an improvement from getting no action from the buttons before. Knowing that the database does hold the table members. I guess, what it is really telling me is that it cannot find the Database to access.
Thanks for helping me to understand LiveCode better and in trying to understand the difference need to run on Android Phones.
Code: Select all
global gConnID, gHomeFolder
on preOpenStack
set the enabled of button "Login" to true
// put the effective filename of this stack into gHomeFolder
// set the itemDelimiter to slash
// put item 1 to -2 of gHomeFolder into gHomeFolder
// set the defaultFolder to gHomeFolder
disable widget "navbar"
connectToDB
end preOpenStack
Code: Select all
on connectToDB
local tDatabasePath, tDatabaseID, tSourceFile
-- Check if we are in the IDE:
if the environment = "development" then
put specialFolderPath("resources") & "/membershipdatabase.db" into tDatabasePath
-- Folder where the stack is in, we may write here in the IDE!
else
-- Runtime:
put specialFolderPath("documents") & "/membershipdatabase.db" into tDatabaseID
end if
-- Now check if the app has started the very first time but only as the final
-- runtime because of our check above!
if there is NOT a file tDatabasePath then
put specialFolderPath("resources") & "/membershipdatabase.db" into tSourceFile
put URL("binfile:" & tSourceFile) into URL("binfile:" & tDatabasePath)
end if
-- Green Light, File Present, Ready to Connect
put revOpenDatabase("sqlite", tDatabasePath,,,,) into tDatabaseID
if tDatabaseID is "" then
answer warning "There was a problem accessing the Membership Database!"
end if
// put "membershipdatabase.db" into tDatabasePath
// setDatabaseID tDatabaseID
end connectToDB
After saving as a standalone I then tested the program in the Android Emulator. When I accessed the Main Screen, whereas before when I selected any of the buttons (Members Paid, Members Due and Members List). Literally nothing would happen. However, this time when selecting any of the three buttons (Coding for which can be found previously within the Post and Replies). I receive the follow message: This is also the same message I get when my project moves from the first card to the second card. The second card being the main where the first card is the Login screen. The Login has not been coded yet.
There was a problem accessing the Database: rebdberr,Database Error: No such table: members
This to me appears to be at least an improvement from getting no action from the buttons before. Knowing that the database does hold the table members. I guess, what it is really telling me is that it cannot find the Database to access.
Thanks for helping me to understand LiveCode better and in trying to understand the difference need to run on Android Phones.
Re: Creating Apps for use on Android mobile phones
Wrong resp. NO PATHNAME in runtime, so LC will TRY to open the db in -> resources, which is not allowed and gives an error!
Code: Select all
...
else
-- Runtime:
## put specialFolderPath("documents") & "/membershipdatabase.db" into -> tDatabaseID
put specialFolderPath("documents") & "/membershipdatabase.db" into tDatabasePath
end if
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
I really do not know what is happening here ….. or why it is not working.
I have included / amended the line of code as recommended:
But I still get the same message as before, stating that there was no such table: members.
I am at a complete loss. I have taken on all the points raised and given …. so frustrating. I am sure it is something that is so simple.
Best Regards
I have included / amended the line of code as recommended:
Code: Select all
else
-- Runtime:
## put specialFolderPath("documents") & "/membershipdatabase.db" into -> tDatabaseID
put specialFolderPath("documents") & "/membershipdatabase.db" into tDatabasePath
end if
I am at a complete loss. I have taken on all the points raised and given …. so frustrating. I am sure it is something that is so simple.
Best Regards
Re: Creating Apps for use on Android mobile phones
Hi,
when you add your "myDB.sqlite" in the "copy File" sttings, it ends in specialFolderPath("resources").
This isn't good 'cause you cannot use it there. You have to copy it to specialFolderPath("documents") before!
Attention - as soon as you try to connect to a non-existent specialFolderPath("documents") & "myDB.sqlite" there will be an empty one created, and above will not run! So uninstall the old version from your Android before to get rid of it.
(Hope this isn't redundant ...)
Have fun!
when you add your "myDB.sqlite" in the "copy File" sttings, it ends in specialFolderPath("resources").
This isn't good 'cause you cannot use it there. You have to copy it to specialFolderPath("documents") before!
Code: Select all
on openstack
if not (there is a file (specialFolderPath("documents") & "myDB.sqlite")) then
put URL ("binfile:" & specialFolderPath("resources") & "myDB.sqlite") \
into URL (specialFolderPath("documents") & "myDB.sqlite")
end if
...
(Hope this isn't redundant ...)
Have fun!
All code published by me here was created with Community Editions of LC (thus is GPLv3).
If you use it in closed source projects, or for the Apple AppStore, or with XCode
you'll violate some license terms - read your relevant EULAs & Licenses!
If you use it in closed source projects, or for the Apple AppStore, or with XCode
you'll violate some license terms - read your relevant EULAs & Licenses!
-
- Posts: 29
- Joined: Mon Apr 20, 2020 1:00 pm
Re: Creating Apps for use on Android mobile phones
Sorry. After adding the coded suggested to the stack openStack . I then run within the LiveCode. No Problem. Running in the emulator produced the same problem indicating no table: members. When running on my Android Phone, then none of the buttons worked.
If anyone who feels they can help further, (and of course willing). Then I would be well happy to send the complete project to your email address. I just want to get to the bottom of this and start progressing further with programming education.
Thanks.
If anyone who feels they can help further, (and of course willing). Then I would be well happy to send the complete project to your email address. I just want to get to the bottom of this and start progressing further with programming education.
Thanks.
Re: Creating Apps for use on Android mobile phones
Hi,
this looks nasty. And I need to apologize, my last example was meant as pseudo-code, and contained errors.
I tried to re-create the problem, and ran into a nasty ugliness in my trusty old LC 6.7.10 - there you need to add the database libs in the Android section of the StandAlone properties, additionally ...
Anyways, for the following I used 9.5.1, as slow, bloated & ugly it may be :/
So, time to debug. I suggest you use the "test target/ test", this should be the quickest way.
If revdb_connect fails, compile an .APK, open it (with 7zip, for instance) & check in "/lib/[architecture]/" - you need "libdbsqlite.so" there, as well as "librevdb.so". If they don't exist, the database extensions have not been added. Play with your settings, maybe try with fresh LC preferences ...
If revdb_connect succeeds, but revdb_queryList fails, then you have an error in your SQL. Try again with a simple query, test this query in your desktop sqlite with your sqlite manager - it's often simple typos.
Use single quotes for not-numeric data, and be sure you don't use reserved words as table or field names - in that case make yourself comfortable to use grave accents as in my example, they work well in nearly every database engine!
if this all doesn't help, write again, and try to provide as much information as possible. Best luck!
this looks nasty. And I need to apologize, my last example was meant as pseudo-code, and contained errors.
I tried to re-create the problem, and ran into a nasty ugliness in my trusty old LC 6.7.10 - there you need to add the database libs in the Android section of the StandAlone properties, additionally ...
Anyways, for the following I used 9.5.1, as slow, bloated & ugly it may be :/
So, time to debug. I suggest you use the "test target/ test", this should be the quickest way.
- For the .sqlite that you add, make sure there's a table "members" in it & that it contains some records. To manage your SQLite databases, use "HeidiSQL" (SQLite here is experimental but works ...), "SQLite Manager" if you have a browser that supports it, "DB Browser for SQLite", or whatever runs on your system.
Make sure you add the db via "copy Files" in the standAlone settings.
. - Replace the openStack part:
Here we take care that the "myDB.sqlite" actually ends in a place where we have write access. Once this runs flawlessly you can remove the "answer" lines.
Code: Select all
global gPath on openstack put the defaultFolder into gPath -- preserve it set the defaultfolder to specialfolderPath("resources") & slash answer "SFP Resources, Files:" & CR & the files -- files in resources answer "There is a DB in Resorces?" & CR & ("myDB.sqlite" is in the files) set the defaultfolder to specialfolderPath("documents") & slash answer "There is a DB in Documents?" & CR & ("myDB.sqlite" is in the files) if not ("myDB.sqlite" is in the files) then put URL ("binfile:" & specialFolderPath("resources") & slash & "myDB.sqlite") \ into URL "binfile:./myDB.sqlite" answer "Tried to copy, result:" & CR & the result end if answer "SFP Documents, Files:" & CR & the files -- files in documents set the defaultFolder to gPath -- reset it ... end openstack
. - Now make a button in your stack, and add this code:
If this doesn't work, something is really, really wrong.
Code: Select all
global gPath on mouseUp set the defaultfolder to specialfolderPath("documents") & slash answer "There is a DB in Documents?" & CR & ("myDB.sqlite" is in the files) get revdb_connect("sqlite","myDB.sqlite") -- connect if it is not a number then answer "Connection failed:" & CR & it -- ouch! exit mouseUp else put it into myDBID -- gotcha! end if set the defaultfolder to gPath put "SELECT * FROM `members` LIMIT 1;" into StrSQL get revdb_queryList(tab,CR,myDBID,StrSQL) -- get some data if it begins with "revdberr" then answer "Query failed:" & CR & it & CR & StrSQL else answer "Success!" & CR & it end if get revdb_disconnect(myDBID) -- and clean up end mouseUp
If revdb_connect fails, compile an .APK, open it (with 7zip, for instance) & check in "/lib/[architecture]/" - you need "libdbsqlite.so" there, as well as "librevdb.so". If they don't exist, the database extensions have not been added. Play with your settings, maybe try with fresh LC preferences ...
If revdb_connect succeeds, but revdb_queryList fails, then you have an error in your SQL. Try again with a simple query, test this query in your desktop sqlite with your sqlite manager - it's often simple typos.
Use single quotes for not-numeric data, and be sure you don't use reserved words as table or field names - in that case make yourself comfortable to use grave accents as in my example, they work well in nearly every database engine!
if this all doesn't help, write again, and try to provide as much information as possible. Best luck!
All code published by me here was created with Community Editions of LC (thus is GPLv3).
If you use it in closed source projects, or for the Apple AppStore, or with XCode
you'll violate some license terms - read your relevant EULAs & Licenses!
If you use it in closed source projects, or for the Apple AppStore, or with XCode
you'll violate some license terms - read your relevant EULAs & Licenses!