Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error CapacitorSQLitePlugin :null only in production #494

Closed
wimZ opened this issue Dec 12, 2023 Discussed in #493 · 24 comments
Closed

Error CapacitorSQLitePlugin :null only in production #494

wimZ opened this issue Dec 12, 2023 Discussed in #493 · 24 comments

Comments

@wimZ
Copy link

wimZ commented Dec 12, 2023

Discussed in #493

Originally posted by wimZ December 11, 2023
My app used to run fine in producton.

After various modifications and plugin updates, it now runs fine in debug mode on a Samsung A53 5G (Android 13) but when I publish to play-store and install on the same device I get error : CapacitorSQLitePlugin :null
The error occurs on createConnection

Install from Playstore to an older device with Android 9 and it runs fine.

I have
rolled back recent updates
cleaned project
reinstalled SQLite including some previous versions

I would appreciate any suggestions how to proceed.

@jepiqueau
Copy link
Collaborator

@wimZ Not really an idea. May be you should try to invalidate the cache File->Invalidate Caches select all caches and invalidate and restart. and redo the full sequence

npx cap sync
npm run build
npx cap copy
npx cap open android

in Android Studio do

  • Build-> Clean Project
  • File-> Sync Project with Gradle Files
  • Build-> Rebuild Project

i never published an app to the play-store, i only develop capacitor plugins, so here i cannot help

Hope this will help

Which version of Android Studio ?

@wimZ
Copy link
Author

wimZ commented Dec 14, 2023

@jepiqueau: The rebuild as described was not successful.

Android Studio is 2023.1.1

;)

@ileosebastian
Copy link

I had the same problem, but not in production but with the app-debug that generates the ionic capacitor run android command.
Using the app made by Jepiqueau, called ionic7-angular-sqlite-starter, I have been able to solve the problem, to tell the truth, without much insight into how exactly I did it.
I thought it was a problem with the capacitor.config.ts file, but it's not. Today I needed to install Capacitor's SplashScreen for my app, installing it as the official Capacitor website suggests, and when I used it only once and re-did the app-debug, I got this message again, that is, CapacitorSQLitePlugin:null. I have uninstalled the SplashScreen plugin and returned to my previous functional build and the problem still exists.

I have been able to analyze that this only happens on certain Android devices, specifically on my physical device that has Android 12, but on Android Studio emulated devices this problem does not occur (I tried APIs 30, 31 and 32).

I've also noticed ambiguities depending on what OS I run my Ionic project on. Since it works perfectly on the physical device if I run it on Manjaro OS.

Post data: This is the first time I speak in a discussion forum here on Git hub, if I have been impertinent in any community rule, I apologize to everyone.

I have attached my package.json below:
package.json

@ileosebastian
Copy link

@jepiqueau: The rebuild as described was not successful.

Android Studio is 2023.1.1

;)

I did the same process and I got the exact same thing.

@rijeshpk
Copy link

rijeshpk commented Dec 18, 2023

@wimZ @ileosebastian
I had similar issue when I uninstall and reinstall app. It restores old data and creates the plugin issue you mentioned. Setting allowbackup='false' fixed the issue, which excludes the old app data when reinstalling the app.
Below link has changes required to be done for older version of android and new.
https://stackoverflow.com/questions/70365809/how-to-specify-to-not-allow-any-data-backup-with-androiddataextractionrules

@jepiqueau

@jepiqueau
Copy link
Collaborator

@rijeshpk thnks for this,
@wimZ @ileosebastian Can you try what @rijeshpk proposed and tell me if it works.
otherwise there is solution to clean the cache programmatically when you re-install the app

@wimZ
Copy link
Author

wimZ commented Dec 18, 2023

@jepiqueau,
I already made these settings with same result.

BTW I use plain capacitor without framework

In order to figure out where it starts to fail, I wanted to create a minimal app and rebuild from there while phased testing
Unluckily I run into the following:

After initial setup as per: https://capacitorjs.com/docs/getting-started
then npm i @capacitor-community/sqlite
This creates a vite build.

Then I get the following result

my index.js (stripped out non-essentials)

import {CapacitorSQLite,SQLiteConnection) from '@capacitor-community/sqlite'
const _db = CapacitorSQLite
const dbName='abc'

//1
await _db.createConnection({database: dbName,encrypted: false,mode: 'no-encryption',version: 1,})

//2
await _db.open({ database: dbName })

//3
await _db.execute({database: dbName, statements: [DROP TABLE IF NOT EXIST test], values: [],})
Error:
Execute: Attempt to invoke virtual method 'java.lang.String java.lang.String.replace(java.lang.CharSequence, java.lang.CharSequence)' on a null object reference
at returnResult ((index):917:32)
at cap.fromNative ((index):899:17)
at :1:18

//4
await _db.query({database: dbName, statement: 'Select * from test', values: [], })
Error:
Query: in selectSQL cursor no such table: test: , while compiling: Select * from test

This result expected, since the table does not exist

@jepiqueau
Copy link
Collaborator

@wimZ can you share your minimal app

@wimZ
Copy link
Author

wimZ commented Dec 18, 2023 via email

@eideard-hm
Copy link

Any solution, it does not work for me at all

@ileosebastian
Copy link

@rijeshpk thnks for this, @wimZ @ileosebastian Can you try what @rijeshpk proposed and tell me if it works. otherwise there is solution to clean the cache programmatically when you re-install the app

In fact @jepiqueau, I can say that what @rijeshpk says works perfectly for my case. That is, I applied everything mentioned in android-quirks (I didn't do it before because I was testing it only in a web environment with SQL queries) and then reinstalled all the packages and added android back to the ionic project to see if it worked. It is indeed an error in the cache and/or permissions that the application has that is causing the CapacitorSQLitePlugin to not be instantiated.

@ileosebastian
Copy link

import {CapacitorSQLite,SQLiteConnection) from '@capacitor-community/sqlite' const _db = CapacitorSQLite const dbName='abc'

//1 await _db.createConnection({database: dbName,encrypted: false,mode: 'no-encryption',version: 1,})

//2 await _db.open({ database: dbName })

//3 await _db.execute({database: dbName, statements: [DROP TABLE IF NOT EXIST test], values: [],}) Error: Execute: Attempt to invoke virtual method 'java.lang.String java.lang.String.replace(java.lang.CharSequence, java.lang.CharSequence)' on a null object reference at returnResult ((index):917:32) at cap.fromNative ((index):899:17) at :1:18

//4 await _db.query({database: dbName, statement: 'Select * from test', values: [], }) Error: Query: in selectSQL cursor no such table: test: , while compiling: Select * from test

This result expected, since the table does not exist

Following only the lines of code that execute the queries from the plugin (but uncommented), the 'test' table is never created in the first instance, so it is correct that the query cannot be made.

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023 via email

@jepiqueau
Copy link
Collaborator

@wimZ can you share it on github so i can clone it and test it

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023

@jepiqueau

You should now have access

Appreciate your support!!!

@jepiqueau
Copy link
Collaborator

@wimZ can you give me the link

@jepiqueau
Copy link
Collaborator

@wimZ i mean the link to your github repository where you have updated your app so i can clone it quickly

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023

my 1st time sharing.

https://github.com/wimZ/sqlitetest/invitations

@jepiqueau
Copy link
Collaborator

@wimZ i got it and i will have a look

@jepiqueau
Copy link
Collaborator

@wimZ Did the bug happens on Android as you do not implement the web part

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023

Yes its android where it fails

My original app is only android.

@jepiqueau
Copy link
Collaborator

@wimZ modify your index.js file as below:

/** @format */

import { SplashScreen } from '@capacitor/splash-screen'
import {
   CapacitorSQLite,
   SQLiteConnection,
} from '@capacitor-community/sqlite'
const _sqlite = CapacitorSQLite
const sqliteConnection = new SQLiteConnection(_sqlite);
let _db
let dbName = 'abcdefghijk',
   result = false

const main = () => {
   SplashScreen.hide()
   document
      .querySelector('#connect-db')
      .addEventListener('click', async function (e) {
         try {
            console.log('creating connection')
            _db = await sqliteConnection.createConnection(
               dbName, false, 'no-encryption', 1, false)
            console.log("$$$$ _db: ",_db)
         } catch (e) {
            console.info(e.message)
         }
      })
   document
      .querySelector('#open-db')
      .addEventListener('click', async function (e) {
         try {
            console.info('opening db')
            await _db.open()
         } catch (e) {
            console.info(e.message)
         }
      })
   document
      .querySelector('#drop-db')
      .addEventListener('click', async function (e) {
         try {
            result = await _db.execute(`DROP TABLE IF EXISTS test;`)
            console.log(result)
         } catch (e) {
            console.info(e.message)
            console.log(e.stack)
         }
      })
   document
      .querySelector('#create-db')
      .addEventListener('click', async function (e) {
         try {
            result = await _db.execute(
               `CREATE TABLE IF NOT EXISTS test ('sleutel','naam')`)
            console.log(result)
         } catch (e) {
            console.info(e.message)
         }
      })
   document
      .querySelector('#insert-db')
      .addEventListener('click', async function (e) {
         try {
            result = await _db.execute(
                  `insert into test (sleutel, naam) VALUES (1, 'truus');`)
            console.log(result)
         } catch (e) {
            console.info(e.message)
         }
         try {
            result = await _db.execute('insert into test (sleutel, naam) VALUES (2, "kees");')
            console.log(result)
         } catch (e) {
            console.info(e.message)
         }
      })
   document
      .querySelector('#query-db')
      .addEventListener('click', async function (e) {
         try {
            result = await _db.query('Select * from test;',[])
            console.log(JSON.stringify(result.values))
            console.log(result)
         } catch (e) {
            console.info(e.message)
         }
      })
}

main()

this will work
i will advise you to look at the tutorials
Good luck for your development

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023

Works! Thanks.

The app was migrated from Cordova, and as far as I recall I never modified the way I instantiated sqlite db

I'll check if problem in the app can be solved the same way.

@wimZ
Copy link
Author

wimZ commented Dec 19, 2023

Tests so far show that my issue is resolved.

Thanks for supporting this.

@wimZ wimZ closed this as completed Dec 19, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants