最初に このエラー があり、それを解決しました。わかりました。デバイスでデバッグしようとすると(ionic cordova run Android
)。データベースSQLがロードされていません。データベースsqliteが作成されていないか、作成されていないように表示されます。コンソールをチェックインすると、次のように表示されます。
エラーエラー:キャッチされていません(約束されています):TypeError:未定義のプロパティ 'then'を読み取れませんTypeError:AppComponent.Push ../ src/app/app.component.ts.AppComponent.createDatabaseで未定義のプロパティ 'then'を読み取れません>(app.component.ts:101)at app.component.ts:87
App.component.tsに私はこれを持っています:
import { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx';
import { DbService } from './services/db/db.service';
rootPage: string = null;
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar,
private translate: TranslateService,
private router: Router,
private menuCtrl: MenuController,
public DbService: DbService,
public sqlite: SQLite
//private screenOrientation: ScreenOrientation
) {
this.initializeApp();
}
public TableCreated = "POR EL MOMENTO NO";
public ahora = "ahora";
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this.translate.setDefaultLang('en');
this.createDatabase();
});
}
closeMenu() {
this.menuCtrl.close();
}
private createDatabase(){
this.sqlite.create({
name: 'data.db',
location: 'default' // the location field is required
}).then((db: SQLiteObject) => { <<<<----- ERROR HERE !!! but I don't know why.
this.TableCreated = "FUE CREADA LA DB!";
this.DbService.setDatabase(db);
return this.DbService.createTable();
})
.then(() => {
this.TableCreated = "FUE CREADA LA TABLA!";
return this.DbService.createFirstRunningApp();
})
.then(() =>{
this.TableCreated = "SE INSERTÓ LOS DATOS";
this.splashScreen.hide();
this.rootPage = 'HomePage';
})
.catch(error =>{
console.error(error);
});
}
Db.services.ts内:
import { SQLiteObject } from '@ionic-native/sqlite/ngx';
export class DbService {
db: SQLiteObject = null;
constructor() { }
setDatabase(db: SQLiteObject){
if(this.db === null){
this.db = db;
}
}
createTable(){
let sql = 'CREATE TABLE IF NOT EXISTS datis(id INTEGER PRIMARY KEY AUTOINCREMENT, dati TEXT, isTrue INTEGER DEFAULT 0, dateCreated datetime default CURRENT_TIMESTAMP)';
return this.db.executeSql(sql, []);
}
createFirstRunningApp(){ //solo la primera vez se corre
let allDate = [
'Blablabla',
'Something',
'YellowBlueRed',
];
let sql = 'INSERT INTO datis(dati) VALUES(?)';
for (let dati of allDate) {
this.db.executeSql(sql, [dati]);
}
}
}
this.sqlite.create({name: 'data.db'、location: 'default' //ロケーションフィールドは必須です})。then((db:SQLiteObject)<---これはエラーだと思いますが、理由はわかりません。
私の情報:
Ionic:
ionic (Ionic CLI) : 4.1.2 (C:\Users\Tomas\AppData\Roaming\npm\node_m
odules\ionic)
Ionic Framework : @ionic/angular 4.0.0-beta.7
@angular-devkit/core : 0.7.5
@angular-devkit/schematics : 0.7.5
@angular/cli : 6.1.5
@ionic/ng-toolkit : 1.0.8
@ionic/schematics-angular : 1.0.6
Cordova:
cordova (Cordova CLI) : 8.0.0
Cordova Platforms : Android 7.0.0
Cordova Plugins : cordova-plugin-ionic-keyboard 2.1.3, cordova-plugin-i
onic-webview 2.1.4, (and 4 other plugins)
System:
NodeJS : v8.12.0 (C:\Program Files\nodejs\node.exe)
npm : 6.4.1
OS : Windows 7
解決策はありますか?ちなみに、私は初心者です。コードに何かがエスケープされている可能性があります。
ありがとう。
ionic cordova platform add browser
その後
ionic cordova run browser
2番目のコマンドを実行する必要がありました。最初のコマンドでは、最初のコマンドの後でビルドされなかったため。この後、それは働きました。
私はこれを私のプロジェクトで使用していますが、機能します。それがあなたを助けるかどうか試してみてください。
import { Injectable } from '@angular/core';
import { SQLiteObject, SQLite } from '@ionic-native/sqlite';
import { Platform } from 'ionic-angular';
@Injectable()
export class SqliteHelperService {
private db: SQLiteObject
constructor(
public platform: Platform,
public sqlite: SQLite) {
}
private createDatabase(dbName?:string): Promise<SQLiteObject> {
return this.platform.ready()
.then((readySource: string) => {
return this.sqlite.create({
name: dbName || 'ks.db',
location: 'default'
}).then((db: SQLiteObject) => {
this.db = db;
return this.db;
}).catch((error: Error) => {
console.log('Error on open or create database: ', error);
return Promise.reject(error.message || error);
});
});
}
getDb(dbName?:string, newOpen?:boolean): Promise<SQLiteObject>{
if (newOpen) return this.createDatabase(dbName);
return (this.db) ? Promise.resolve(this.db) : this.createDatabase(dbName);
}
}
私はsqlitewhit angular 6 and ionic v4も使用していますが、dbのすべてのオブジェクトを返す方法は少し汚いと思います。サービスのデータベースですべての対話を実行し、結果のみを返します。
import { Injectable } from '@angular/core';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx';
@Injectable()
export class SQLiteService {
constructor(
private sqlite: SQLite
) {}
rawQuery(queryText: string, params?: any[]): any {
return new Promise((resolve, reject) => {
this.sqlite.create({name: 'data.db', location: 'default'}).then((db: SQLiteObject) => {
db.executeSql(queryText, params || []).then((data) => {
resolve(data);
}).catch(error => reject(error));
}).catch(error => reject(error));
});
}
}
コードを少し変更しましょう:
private createDatabase(){
const conn = this.sqlite.create({
name: 'data.db',
location: 'default' // the location field is required
})
console.log('i think the db conn is undefined', conn);
conn.then(() => {
// etc
})
}
ここで、conn
がundefined
の場合、undefined.then
を呼び出そうとしているので、まったく意味がありません。そのため、エラーが発生します。本当の原因は、db接続の作成に失敗していることです。それはまったく別の問題です。次のようにコードを変更すると、より簡単になります。
private createDatabase(){
const conn = this.sqlite.create({
name: 'data.db',
location: 'default' // the location field is required
})
if (conn == null) throw Error('Failed to create database connection')
conn.then(() => {
// etc
})
}
このエラーの早期発見により、コードのデバッグがはるかに簡単になります。