J'ai essayé d'incorporer sqlite dans une simple application Ionic et c'est le processus que j'ai suivi:
ionic start myApp sidemenu
Ensuite, j'installe le plugin sqlite:
ionic plugin add https://github.com/brodysoft/Cordova-SQLitePlugin
et ngCordova
bower install ngCordova
cela m'a donné les options suivantes: Impossible de trouver une version appropriée pour angulaire, veuillez en choisir une: 1) angulaire # 1.2.0 qui a résolu en 1.2.0 et est requis par ngCordova # 0.1.4-alpha 2) angulaire #> = 1.0.8 qui a résolu en 1.2.0 et est requis par angular-ui-router # 0.2.10 3) angulaire # 1.2.25 qui a résolu en 1.2.25 et est requis par angular-animate # 1.2.25, angular-sanitize # 1.2.25 4) angulaire # ~ 1.2.17 qui s'est résolu à 1.2.25 et est requis par ionique # 1.0.0-beta.13Préfixez le choix avec! le persister à bower.json
J'ai choisi l'option 3) et j'ai inclus les scripts dans le fichier comme suit:
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.js"></script>
<script src="cordova.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
J'ai ensuite ajouté un contrôleur à la vue de recherche:
.controller('SearchCtrl', function ($scope, $cordovaSQLite){
console.log('Test');
var db = $cordovaSQLite.openDB({ name: "my.db" });
// for opening a background db:
var db = $cordovaSQLite.openDB({ name: "my.db", bgType: 1 });
$scope.execute = function() {
console.log('Test');
var query = "INSERT INTO test_table (data, data_num) VALUES (?,?)";
$cordovaSQLite.execute(db, query, ["test", 100]).then(function(res) {
console.log("insertId: " + res.insertId);
}, function (err) {
console.error(err);
});
};
})
Cela a provoqué l'erreur:
> TypeError: Cannot read property 'openDatabase' of undefined
> at Object.openDB (http://localhost:8100/lib/ngCordova/dist/ng-cordova.js:2467:36)
Ensuite, j'ai essayé d'inclure manuellement le SQLitePlugin.js en: copiant depuis plugins/com.brodysoft.sqlitePlugin/www vers le principal - www/ et l'ajout à la page index.html
J'ai essayé d'inclure avant tout:
<script src="SQLitePlugin.js"></script>
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.js"></script>
<script src="cordova.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
J'obtiens une erreur ReferenceError: cordova n'est pas défini j'ai donc essayé de l'inclure après le script cordova.js mais j'obtiens toujours la même erreur
apprécierait vraiment l'aide si elle est pertinente, ce sont les versions actuelles de Cordova et ionic J'utilise:
ionic --version 1.2.5
cordova --version 3.5.0-0.2.7
et ceci est le bower.json généré
{
"name": "myApp",
"private": "true",
"devDependencies": {
"ionic": "driftyco/ionic-bower#1.0.0-beta.13"
}
}
et mon package.json:
{
"name": "myapp",
"version": "1.0.0",
"description": "myApp: An Ionic project",
"dependencies": {
"gulp": "^3.5.6",
"gulp-sass": "^0.7.1",
"gulp-concat": "^2.2.0",
"gulp-minify-css": "^0.3.0",
"gulp-rename": "^1.2.0"
},
"devDependencies": {
"bower": "^1.3.3",
"gulp-util": "^2.2.14",
"shelljs": "^0.3.0"
}
}
Si quelqu'un a toujours une erreur en essayant de l'exécuter dans un navigateur, essayez celui-ci:
if (window.cordova) {
db = $cordovaSQLite.openDB({ name: "my.db" }); //device
}else{
db = window.openDatabase("my.db", '1', 'my', 1024 * 1024 * 100); // browser
}
Il s'avère donc que c'est parce que Cordova est spécifique à la plate-forme et ne fonctionne pas lorsque vous exécutez ionic serve
J'ai pu exécuter le même code sur un appareil Android sans problème lorsque j'ai construit et déployé.
vous pouvez remplacer le plugin cordova par window pour utiliser les bases de données websql donc au lieu de sqlitePlugin.openDatabase()
vous pouvez utiliser window.openDatabase()
Pour plus tard Ionic versions (Ionic 2 +):
La meilleure façon de gérer le stockage persistant avec Ionic utilise ionic-storage .
Ionic Storage est un package créé et maintenu par l'équipe ionic pour extraire le développement des spécificités de chaque navigateur ou plate-forme et utiliser automatiquement la meilleure solution de stockage disponible.
Dans votre cas pour SQLite, vous devez d'abord installer les dépendances pour les deux Angular et Cordova:
npm install @ionic/storage --save
et
cordova plugin add cordova-sqlite-storage --save
Modifiez ensuite votre déclaration NgModule dans src/app/app.module.ts
pour ajouter IonicStorageModule
en tant qu'importation:
import { IonicStorageModule } from '@ionic/storage';
@NgModule({
declarations: [...],
imports: [
IonicModule.forRoot(MyApp),
IonicStorageModule.forRoot({
name: '__mydb',
driverOrder: ['indexeddb', 'sqlite', 'websql'],
})
],
bootstrap: [...],
entryComponents: [...],
providers: [...],
})
export class AppModule { }
import { Component } from '@angular/core';
import { Storage } from '@ionic/storage';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
constructor(public storage: Storage) {}
}
Chaque fois que vous accédez au stockage, assurez-vous de toujours envelopper votre code dans les éléments suivants:
storage.ready().then(() => { /* code here safely */});
storage.ready().then(() => {
storage.set('some key', 'some value');
});
storage.ready().then(() => {
storage.get('age').then((val: string) => {
console.log('Your age is', val);
});
});
storage.ready().then(() => {
storage.remove('key').then((key: string) => { /* do something after deletion */})
});
Dans Ionic 2, j'utilise le code suivant.
constructor(platform: Platform) {
platform.ready().then(() => {
if(platform.is("cordova")){
//USE Device
}
else {
//USE Browser
}
StatusBar.styleDefault();
});