Wie verarbeiten die Rückkehr von sqlite Select-Anweisung in ionic 2?
Arbeite ich auf eine Ionic 2 (2.0.0-rc.2
) app mit einer sqlite-Speicher und ich habe lief in einige Probleme, daher Suche ich nach Hilfe hier.
Beim Start der app zum ersten mal, dass ich mich dem erstellen der Datenbank(Tabellen) setzen Sie ein paar Werte. So weit geht alles in Ordnung. Aber wenn ich versuche, Daten abzurufen und zu Lesen aus der Datenbank, ich bin immer ein Fehler.
Der Klasse waren, die ich spreche:
import {Component} from '@angular/core';
import {Platform} from 'ionic-angular';
import {StatusBar, Splashscreen, SQLite} from 'ionic-native';
import {HomePage} from '../pages/home/home';
@Component({
template: `<ion-nav [root]="rootPage"></ion-nav>`
})
export class MyApp {
users = [];
rootPage = HomePage;
constructor(platform: Platform) {
platform.ready().then(() => {
StatusBar.styleDefault();
let db = new SQLite();
console.log("open database app.compontent")
db.openDatabase({
name: "data.db",
location: "default"
}).then(() => {
db.executeSql("CREATE TABLE IF NOT EXISTS user (iduser INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT, castleType TEXT, castleHealth INTEGER); ", {}).then((data) => {
console.log("USER TABLE CREATED: ", data);
}, (error) => {
console.error("USER Unable to execute sql", error);
});
db.executeSql("CREATE TABLE IF NOT EXISTS melding (idmelding INTEGER PRIMARY KEY AUTOINCREMENT, meldingType TEXT, meldingTitel TEXT, meldingOmschrijving TEXT, ruimte INTEGER, user_iduser INTEGER, FOREIGN KEY (user_iduser) REFERENCES user(iduser)); ", {}).then((data) => {
console.log("MELDING TABLE CREATED: ", data);
}, (error) => {
console.error("MELDING Unable to execute sql", error);
});
db.executeSql("CREATE TABLE IF NOT EXISTS kasteelOnderdelen (idkasteelOnderdelen INTEGER PRIMARY KEY AUTOINCREMENT, onderdeelNaam TEXT, onderdeelShort TEXT, onderdeelHealth TEXT); ", {}).then((data) => {
console.log("KASTEELONDERDELEN TABLE CREATED: ", data);
}, (error) => {
console.error("KASTEELONDERDELEN Unable to execute sql", error);
});
db.executeSql("CREATE TABLE IF NOT EXISTS user_has_kasteelOnderdelen (id INTEGER PRIMARY KEY AUTOINCREMENT, user_iduser INTEGER, kasteelOnderdelen_idkasteelOnderdelen INTEGER, FOREIGN KEY (user_iduser) REFERENCES user(iduser), FOREIGN KEY (kasteelOnderdelen_idkasteelOnderdelen) REFERENCES kasteelOnderdelen(idkasteelOnderdelen));", {}).then((data) => {
console.log("USER_HAS_KASTEELONDERDELEN TABLES CREATED: ", data);
}, (error) => {
console.error("USER_HAS_KASTEELONDERDELEN Unable to execute sql", error);
});
console.log('Creating database complete!');
db.executeSql("INSERT INTO user (firstname, lastname, castletype, castleHealth) VALUES (?, ?, ?, ?)", ['Jan', 'Klaassen', 'mannelijk', '10']).then((data) => {
console.log("Inserted row 1: ", data);
}, (error) => {
console.error("Unable to insert row 1: ", error);
});
db.executeSql("INSERT INTO user (firstname, lastname, castletype, castleHealth) VALUES (?, ?, ?, ?)", ['Klaas', 'Janssen', 'mannelijk', '5']).then((data) => {
console.log("Inserted row 2: ", data);
}, (error) => {
console.error("Unable to insert row 2: ", error);
});
db.executeSql('SELECT * FROM user', []).then((resultSet) => {
if(resultSet.res.rows.length > 0) {
this.users = [];
for(let i = 0; i < resultSet.res.rows.length; i++) {
this.users.push({
"iduser": resultSet.res.rows.item(i).iduser,
"firstname": resultSet.res.rows.item(i).firstname,
"lastname": resultSet.res.rows.item(i).lastname,
});
}
}
}, (error) => {
console.log(error);
});
}, (error) => {
console.error("Unable to open database", error);
});
Splashscreen.hide();
});
}
}
Fehler (wenn ich es auf einem Gerät (Nexus 5):
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 12 : Error: Uncaught (in promise): TypeError: Cannot read property 'rows' of undefined
at s (file:///android_asset/www/build/polyfills.js:3:8568)
at file:///android_asset/www/build/polyfills.js:3:8940
at t.invokeTask (file:///android_asset/www/build/polyfills.js:3:14051)
at Object.inner.inner.fork.onInvokeTask (file:///android_asset/www/build/main.js:3:22982)
at t.invokeTask (file:///android_asset/www/build/polyfills.js:3:13987)
at e.runTask (file:///android_asset/www/build/polyfills.js:3:11411)
at i (file:///android_asset/www/build/polyfills.js:3:8028)
at u (file:///android_asset/www/build/polyfills.js:2:16275)
at file:///android_asset/www/build/polyfills.js:2:16399
at MutationObserver.r (file:///android_asset/www/build/polyfills.js:2:14841)
Zusätzliche Erkenntnisse/Hinweise:
Wenn ich Schreibe console.log(resultSet);
Die Rücksendung [object object]
Für jetzt ist es, alle in der gleichen Klasse und auf dem longrun wird es in einem eigenen StorageProvider/Service, aber ich habe es verschoben alle hier zu Debuggen. (ohne Erfolg bisher)
Hat jemand eine Ahnung, was den Fehler verursacht?
Vielen Dank im Voraus.
Poerkie
UPDATE 20-12 (nach Umsetzung der Tipps und Anregungen):
aktuelle code:
import {Injectable} from '@angular/core';
import 'rxjs/add/operator/map';
import {SQLite} from 'ionic-native';
import {Platform} from 'ionic-angular';
@Injectable()
export class StorageService {
public database: SQLite;
public users;
constructor(private platform: Platform) {
console.log(' StorageService Initialised');
this.platform.ready().then(() => {
this.database = new SQLite();
this.database.openDatabase({name: "data.db", location: "default"}).then(() => {
console.log("SUCCES Opening DB storageService");
let s1 = this.createUserTable()
let s2 = this.database.executeSql("CREATE TABLE IF NOT EXISTS melding (idmelding INTEGER PRIMARY KEY AUTOINCREMENT, meldingType TEXT, meldingTitel TEXT, meldingOmschrijving TEXT, ruimte INTEGER, user_iduser INTEGER, FOREIGN KEY (user_iduser) REFERENCES user(iduser)); ", {});
return Promise.all([s1, s2]).then(() => {
console.log('creating database complete!');
let i1 = this.insertUser();
let i2 = this.database.executeSql("INSERT INTO user (firstname, lastname, castletype, castleHealth) VALUES (?, ?, ?, ?)", ['Klaas', 'Janssen', 'mannelijk', '5']);
return Promise.all([i1, i2]).then((res) => {
console.log('all insert querys executed', res);
}).then(() => {
console.log('executing sql statement');
return this.database.executeSql('SELECT * FROM user', []);
}).then((resultSet) => {
console.log('after then((resultset): ' + resultSet);
console.log(JSON.stringify(resultSet, undefined, 2));
if (resultSet.res.rows.length > 0) {
console.log('if statement true');
this.users = [];
for (let i = 0; i < resultSet.res.rows.length; i++) {
console.log('forloop');
this.users.push({
"iduser": resultSet.res.rows.item(i).iduser,
"firstname": resultSet.res.rows.item(i).firstname,
"lastname": resultSet.res.rows.item(i).lastname,
});
}
console.log('after forloop');
}
}).catch((error) => {
console.error("db error", error);
})
})
}, (error) => {
console.log("ERROR oepening DB storageService: ", error);
});
});
}
public createUserTable() {
this.database.executeSql("CREATE TABLE IF NOT EXISTS user (iduser INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT, castleType TEXT, castleHealth INTEGER); ", {}).then((data) => {
console.log("USER TABLE CREATED: ", data);
}, (error) => {
console.error("USER Unable to execute sql", error);
});
}
public insertUser() {
this.database.executeSql("INSERT INTO user (firstname, lastname, castletype, castleHealth) VALUES (?, ?, ?, ?)", ['Jan', 'Klaassen', 'mannelijk', '10']).then((data) => {
console.log('Insert Succesful');
}, (error) => {
console.error('user not inserted: ' + error);
});
}
}
nexus 5 outputlog:
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : StorageService Initialised
I/chromium: [INFO:CONSOLE(6)] " StorageService Initialised", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : CastleService initialized
I/chromium: [INFO:CONSOLE(6)] "CastleService initialized", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 5 : SlimLabsService initialized
I/chromium: [INFO:CONSOLE(5)] "SlimLabsService initialized", source: file:///android_asset/www/build/main.js (5)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 5 : Logging in!
I/chromium: [INFO:CONSOLE(5)] "Logging in!", source: file:///android_asset/www/build/main.js (5)
12-20 07:48:04.042 796-18483/? W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@fd827af attribute=null, token = android.os.BinderProxy@7d616de
D/CordovaWebViewImpl: onPageFinished(file:///android_asset/www/index.html)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 19 : DEVICE READY FIRED AFTER
I/chromium: [INFO:CONSOLE(19)] "DEVICE READY FIRED AFTER", source: file:///android_asset/www/build/main.js (19)
I/App: WARNING: Back Button Default Behavior will be overridden. The backbutton event will be fired!
D/SystemWebChromeClient: file:///android_asset/www/plugins/cordova-sqlite-storage/www/SQLitePlugin.js: Line 175 : OPEN database: data.db
I/chromium: [INFO:CONSOLE(175)] "OPEN database: data.db", source: file:///android_asset/www/plugins/cordova-sqlite-storage/www/SQLitePlugin.js (175)
V/SQLitePlugin: Android db implementation: built-in android.database.sqlite package
V/info: Open sqlite db: /data/user/0/com.ionicframework.cwistlev1105374/databases/data.db
D/SystemWebChromeClient: file:///android_asset/www/plugins/cordova-sqlite-storage/www/SQLitePlugin.js: Line 179 : OPEN database: data.db - OK
I/chromium: [INFO:CONSOLE(179)] "OPEN database: data.db - OK", source: file:///android_asset/www/plugins/cordova-sqlite-storage/www/SQLitePlugin.js (179)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : SUCCES Opening DB storageService
I/chromium: [INFO:CONSOLE(6)] "SUCCES Opening DB storageService", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : USER TABLE CREATED:
I/chromium: [INFO:CONSOLE(6)] "USER TABLE CREATED: ", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : creating database complete!
I/chromium: [INFO:CONSOLE(6)] "creating database complete!", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : Insert Succesful
I/chromium: [INFO:CONSOLE(6)] "Insert Succesful", source: file:///android_asset/www/build/main.js (6)
12-20 07:48:04.629 1596-1596/? I/Keyboard.Facilitator: onFinishInput()
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : all insert querys executed
I/chromium: [INFO:CONSOLE(6)] "all insert querys executed", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : executing sql statement
I/chromium: [INFO:CONSOLE(6)] "executing sql statement", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : after then((resultset): [object Object]
I/chromium: [INFO:CONSOLE(6)] "after then((resultset): [object Object]", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : {
"rows": {
"length": 42
},
"rowsAffected": 0
}
I/chromium: [INFO:CONSOLE(6)] "{
"rows": {
"length": 42
},
"rowsAffected": 0
}", source: file:///android_asset/www/build/main.js (6)
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 6 : db error
I/chromium: [INFO:CONSOLE(6)] "db error", source: file:///android_asset/www/build/main.js (6)
Zusatzinformation:
Es gibt nicht mehr Informationen über den Fehler oder ich weiß nicht, wie abrufen. (nicht immer ist eine stack-trace oder nichts);
Warum werden nicht wollen, pass auf die Ergebnisse! in der Benutzer[]?
InformationsquelleAutor poerkie | 2016-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme mit Suraj Rao über die async-Ergebnis. Ich möchte hinzufügen, dass Sie tun konnten alle das erstellen von Tabellen in ein Versprechen.alle(). Und wenn zwischen "dann" - Anweisung, legen Sie eine "Rückkehr" auf die Abfrage, das Ergebnis wird voraussichtlich in der nächsten "dann". Eg:
In Ihrem Fall:
Vielen Dank für Ihre Hilfe in den ersten Platz. Ich versuche, die Umsetzung der Versprechen.alle([function1, function2, ect]), Jedoch ist die Funktion noch ausgelöst, nachdem die dann clausule von der Verheißung.alle(); Könnte man einstellen, dein Beispiel ein bisschen mehr, ich habe Probleme inplementing.
Ich mal wieder aktualisiert, sollte alles, was Sie jetzt wollen
Vielen Dank für die Bereitstellung einer umfangreichen Beispiel-code. Es funktioniert perfekt (die Datenbank erstellt, dann fügt es ect) Aber es wird immer noch ein Fehler (und geht "in" der Haken)
was für Fehler? wenn Sie mehrere Male ausführen, möchten Sie vielleicht zu ersetzen "INSERT INTO" - Anweisung durch "EINFÜGEN" ODER "IGNORIEREN " IN"
InformationsquelleAutor nyluje
Die db-bezogenen Funktionen werden mit return ein Versprechen.
Die dann() ist asynchron bedeutet, alle Ihre db-Funktionen von erstellen,einfügen,wählen Sie ausführen können, bevor Sie eine oder mehrere der then-Methode aufgerufen wird.
Angenommen, Sie haben nur die user-Tabelle,müssen Sie
und so weiter.
Resultset.res ist wahrscheinlich null, weil Ihr Tisch noch nicht.
Auch print-Objekte :
console.log(JSON.stringify(resultSet,undefined,2));
InformationsquelleAutor Suraj Rao