This will be a long post but please do read until the end and help out. Thank you!
In continuation of my previous post, [Android Studio - Database file loaded in the wrong encoding: 'UTF-8' my app was working fine when I run it both on my phone & an emulator despite the encoding error.
However, I am facing new issues now and I would like to just clarify why.
Just a head's up, I am using DB Browser for SQLite & Android Studio (3.2.1). My phone is Samsung S7 Edge+ and the emulator I have used is Pixel 2 XL API 28 (Android 9, API 28).
The first issue is that I have added new data into my database but it is not reflected when I run it on my phone. See attached for reference to new data added "database - knowledge.db" database = . I have also ensured that the data is updated by clicking the "Write Changes" tab. Afterward, to import the database to Android Studio, I have to create a database asset folder and stored my Knowledge.db file inside it. I have done so. However, when I run my app on my phone, it does not show the updated data when I scroll down, see the attached
actual phone
. But, when I run it on an emulator, the updated data are shown at
phone emulator
. The new data are those titled, "IIDS" "FIDS" and "GMID". Notice the two phones screenshots, the actual phone screenshots stopped at "Passenger Terminal" and upon scrolling down further no new data are shown, but on the phone emulator, new data are shown.
Initially, I thought it could be the sizing issue so I minimized the text sizes accordingly but the issue persisted. I can't think of other possible causes.
Secondly, I know I have updated the database at DB Browser by clicking the "Write Changes" because when I open it again, the new data and naming changed. But when I import it to Android Studio, it is not fully updated. See attached and the circled for reference. differences
As such, does anyone know what could cause this issue and how I can fix it? Any help is greatly appreciated!
The initial issue was due to the database already existing and thus that the copy from the assets folder is/was not done.
Delete the database (deleting the App's data or uninstalling the App) would result in the database then being copied from the assets folder.
However, you then encountered an issue with the version number. I believe that this was because the App had been changed to use database version 2 (actually from SQLite's point of view the user_version). Thus as the version isn't 1 (I suspect if it's 1 no version check is made, hence why not even having a version (as from the comments was the case)) then an attempt was made to check the DB's version resulting in a null pointer exception as there was no user_version set (perhaps a bug).
Basically you do not want to change the DB version from 1 if you are (when developing the App) re-introducing a changed database that is copied from the assets folder. Alternately you need to set the appropriate version using PRAGMA user_version=? (where ? is the version number) in the database, using whatever tool you use, before copying the databse into the assets folder.
The only reason why you would increase the database version (android wise) is when you are wanting the onUpgrade method to run.
Note assumptions have been made re checking the version number.
If you have released an App, then it could be far more complex to roll out a changed database as an asset.
Related
Technologies used for the app: Ionic, Capacitor, Angular and SQLite
The requirement is to use a prepopulated SQLite database in the app. The methods that I found over the internet across various blogs and forums mentioned running a SQL script to initialize the DB as a pre-population step, but this brings about an unwanted overhead time to start querying the DB. As in the user needs to wait for a minute or so for the SQL Script to run completely every time, even if the app exists.
This issue became a roadblock because when the need became to port a large-sized database, it was no longer feasible to write SQL scripts as the overhead time increased drastically. Also, a bigger problem is, in Android studio, Java started throwing Heap Memory exceeded error.
A solution that I tried was to port the database directly as an asset of the app so that it can be shipped along with the app. But, while placing the database file in src/assets/, every build of the app generates www/ to create a web app that can be wrapped in a native view. The builder and compiler delete all the contents of the previous build in the www/ folder, we must understand that the capacitor looks for the database file at www/ and not in www/assets/, but we can't place the database file at www/ as it gets deleted on every build.
Link to existing issue on using the sqlite extension
maybe my experience can help you
RULES FOR DEVELOPMENT
1
database1 of bundle ( Android APK) from /assets must be static and not for update. because they can be changed when the application will be reinstalled on you version
2
you must to create new database2 - local , on the device , programmatically - to store a user's data. you can affill this database2 with data from database1
3
when you will install new version of application: database1 one may be changed, but the database2 becomes constant
the same situation is in browser: programmatically created database not disappear from session to session.
I check - it works in my application...
I've been trying(for days now) to get an Android map app working. This app has to work offline and im only interested in displaying a small city, after seeing all of my choices and trying them all, it seems that Nutiteq is a great choice, specifically the offline MBTiles option. After setting everything up, and using a .mbtiles file downloaded using TileMill, i get the following error:
No such table android_metadata
The .mbtile file i downloaded doesn't have this table, and i can't find which class made this query(if anyone can explain why it's needed great!!!); i tried updating my .mbtile file with Navicat to add this table with the desired locale column with the en_US value, and now it gives the following log error message:
can't upgrade read-only database from version 0 to 1
My questions are:
Is there a way to bypass this whole android_metadata query? I mean, if it's not included on the .mbtile why is it needed afterwards?
If you don't recommend bypassing it, how to fix my second error with the upgraded database?
Thanks.
Are you trying to modify the database during the upgrade? If it's readonly, you probably can't modify it. You could create a new one, though, and copy the data from the old to the new.
I am using sqlite to save some string values in the database, my app works perfectly in the emulator. But when I tried it on the Samsung Galaxy Tab, the log cat says that there are not such tables... before mounting the apk files to the device I have tried opening it in the archive mode and found the database and the tables secure in my "assets" folder.
Can any one tell me whats going wrong with me ?
thanks in advance...
Happy coding
Databases don't belong in the assets-folder! You should use a SQLiteOpenHelper-class to create and update your Database when it's needed.
Tutorial (or simply Google for it).
I have experience with the same thing you are experiencing now. This is a classic in device manufacturer fragmentation. It has happened to me before when trying to run an application on a Samsung Nexus S phone that had a method to copy a already existing database to the application from assets on install (i am guessing that's what you are doing at the moment). so long story short, after quite some testing the best and only solution i could find was to actually do the manual work and create the database with the help of the SQLiteHelper methods and table creating queries and recreate the same scheme. this method works 100% so far on every phone i have tried it so that's the safest thing you can do.
Hope this helps.
The db file should be available in "/data/data/YOUR_PACKAGE/databases/" folder in your device.
If this is the first time you are creating the db then you should copy the db file from your assets folder into the above location (the first time when you access the database).
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Android sqlite returned: error code = 14
I have a own created SQLite database that i include in assets folder in my Android app, its has works really good.
Before i start using first my realeased version from market and then uninstall the application with all data and run debug on my development version of the app, then i started get "sqlite returned: error code = 14" and what i can see when i logging is that its copying the file to the right folder and not getting any error.
But when its start reading from it its gets the error and then its can not find the tables in the file.
I have tried on my development phone to reinstall the whole phone and then all works again, i startaed install the Market released version then uninstalled it and install the development version and its no problem then.
But on my phone i using for everything else its still a problem and i dont whant to reinstall the whole phone for this.
I have tried uninstall the application with adb and still the same problem.
Someone out there that has any idea how to fix this?
Looks like not a problem for normal users but when i develop and using the different versions its some problem, and i has not changed the database between the two versions...
This happens when something bad has gone into the DB. By bad, I mean something SQLite is not able to read when get is used. That's why uninstalling the app and reinstalling it in the emulator typically works. The solution would be to look into what you are storing and figuring out where things are not OK.
(suggestion from user1526732): Use 'SQLite Database Browser' to examine your DB thoroughly!
Today this issue cost me 3 hours. What I tried:
Rewriting the copy database code.
Deleting the app from the emulator / device
Wiping emulator(s)
Cleaning eclipse
Changing file permissions
Validate that the SQLite database file is working
I solved the problem by copying the code from a shared Dropbox account to another location and refactoring the code in the Android Manifest and java files with another package name.
The application runs beautifully now.
There are some things my application needs to do on first start up(first startup after update) . These actions could be described in a .txt file and then when it is the case read the file and do according to it ,or on the other hand (I lean to use this option) a sqlite database could be used to store the information . The apk file would be shipped with an .txt file/prebuild sql db stored in res/raw or res.asset and then copied into proper space and used. This I have figured out how !, though I'm not sure which option of this two would be the fittest ? One thing that is unclear to me is how could sqlite version mismatch affect me, and if it serious enough to take into consideration ? I 'm using Android api level 4 (Android 1.6) and the future application might be used on several different devices , with different api levels.
These actions could be described in a
.txt file and then when it is the case
read the file and do according to it
,or on the other hand (I lean to use
this option) a sqlite database could
be used to store the information .
Or, they could be implemented in Java.
Well the actions that the application
needs to perform on install / after
update , according to the update
version and the pre update version of
the application
Why not just implement this as regular Java code in your app?
Or, as Albert Einstein wrote, in homage to Occam's Razor: "Make everything as simple as possible, but not simpler."