Android Marshmallow SQLiteOpenHelper onCreate / onUpgrade and file operations - android

currently my app is using a SQLiteOpenHelper to create or upgrade the underlying database. At the same time the app is creating some default database entries with file paths to images which are created in the following step (onCreate) or updating/migrating filepaths (and therefore moving images on external storage to a new location).
Until Android M everything was ok, because all necessary permissions were available. Now with M and targetApi = 23 my app has no longer the permission.
This shows that my solution was never a good one ;)
Whats the best way to do onCreate-Default-Operations or onUpgrade-Migrations which need permissions? Anyone who has the same or a similar problem?
regards,
Thomas

Related

Android Deleted File Search

I am starting with android development. And based on the use case i want to create the app for recovering the deleted files.
Deleted as in deleted from Recycle bin itself. Can anybody guide me through how I scan the memory to identify what memory structure are full vs empty. I know that when the file is deleted it is still in memory. Android just forgot its location. I want to find and then recompile the file.
Any help will be appreciated.
Instead of trying to go that path please consider my advice instead.
Since you are new to android and just starting android development. Consider picking up a simpler project so you can understand the basics first. Tring to get memory access and recover lost files requires a lot of understand of the android architecture, and most of apps, even after being granted admin permissions i.e getting root access (in a rooted device) are not able to recover deleted files.
Here are some ideas to help you get started
Consider a toDo app, or a weather app

database data not fully shown in mobile when run

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.

Using a pre-built db4o database in android app

Im REALLY struggling to get a pre baked db4o database to work inside my android app.
If i include it in the /res/raw folder then read it, it doesn't work.
If i copy it to the app_data or sdcard then try and read it, it will act as if im opening a new database and provide me with 0 entries on queries.
I was previously just creating all my entries when the app was first opened but as the db grew, so did the creation time to unsustainable levels.
I would really, really appreciated any help you can give me. It would be perfect if i can include my pre-populated db4o file in the app.
Additional Info:
I have double checked the db4o file with ome and theres no issue with the db creation on my local machine.
Thanks in advance.
If any one falls into the same trap as me here's the answer:
On android the class is injected into the db4o db with the package name prefixed to the class name by defualt. So accessing from another application will look be looking for +.

Problem with sqlite in the android device

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).

About sqlite use

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."

Categories

Resources