在 ionic 3 的 websql mock 中获取查询 Id(在其他查询中重用)
Get query Id in websql mock in ionic 3 (to reuse in other query)
目前我是 ionic (3) 的新手,我正在尝试构建一个支持数据库的应用程序(这样用户可以在离线时使用该应用程序)。
但是我有一个问题,我无法理解为什么它会这样工作。
我做了什么。
我的设置是 Angular 5 框架上的 ionic3 应用程序。
对于设备上的应用程序,我自己使用 ionic 的 sqlite 插件,但我想模拟该插件,以便我可以在浏览器中进行测试。所以这是我的模拟代码。
export class SQLiteMock {
public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
let db = (<any> window).openDatabase(config.name, '1.0', 'test database', 2 * 1024 * 1024);
return new Promise((resolve, reject) => {
resolve(new SQLiteObject(db));
});
}}
// ------Init call from component------------------------
init(): Promise<boolean> {
return new Promise(resolve => {
this.sqlite.create({
name: 'test.db',
location: 'default'
}).then((db: SQLiteObject) => {
this.db = db;
});
}
);
}
到目前为止一切顺利。当我 运行 它在设备和网络上工作。即使当我创建表格时,一切都正确显示。
问题是当我使用下一个代码在数据库中插入查询时:
executeSql(queryStatement: string, params?: Array<string | number>): Promise<any> {
params = params ? params : [];
return new Promise((resolve, reject) => {
this.db.transaction((tx) => {
tx.executeSql(queryStatement, params,
(tx, result) => {
console.log(result); //--> console: SQLResultSet {rows: SQLResultSetRowList, insertId: 5, rowsAffected: 1}
console.log(Object.assign({}, result)); //--> console: {}
resolve(result);
},
(error) => reject(error));
});
});
}
我想做的是使用第一个查询的insertedId,并在下一个查询中使用它。但是正如您所看到的,当 promise 失效时,结果仍然是空的,因此下一次查询将失败,因为没有 Id。
有人知道为什么我有这个计时问题吗?
我该如何解决这个问题,即 promise 等待得到解决直到结果出现?
已经非常感谢你的帮助,因为我真的被这个问题困住了。
亲切的问候
调用函数的函数
execQuery(query: string, params?: Array<string | number>): Promise<number> {
return new Promise((resolve, reject) => {
this.db.executeSql(query, params)
.then((result: any) => {
resolve(result.insertId); //--> result = {}
})
.catch((e) => reject(e));
});
}
您的第二条 console.log 指令显示空对象 ({}) 的原因似乎与 Object.assign() 函数有关,而不是 WebSQL 问题。根据 documentation of Object.assign() function,只有自己的可枚举属性是从源对象复制的。
目前我是 ionic (3) 的新手,我正在尝试构建一个支持数据库的应用程序(这样用户可以在离线时使用该应用程序)。 但是我有一个问题,我无法理解为什么它会这样工作。
我做了什么。 我的设置是 Angular 5 框架上的 ionic3 应用程序。 对于设备上的应用程序,我自己使用 ionic 的 sqlite 插件,但我想模拟该插件,以便我可以在浏览器中进行测试。所以这是我的模拟代码。
export class SQLiteMock {
public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
let db = (<any> window).openDatabase(config.name, '1.0', 'test database', 2 * 1024 * 1024);
return new Promise((resolve, reject) => {
resolve(new SQLiteObject(db));
});
}}
// ------Init call from component------------------------
init(): Promise<boolean> {
return new Promise(resolve => {
this.sqlite.create({
name: 'test.db',
location: 'default'
}).then((db: SQLiteObject) => {
this.db = db;
});
}
);
}
到目前为止一切顺利。当我 运行 它在设备和网络上工作。即使当我创建表格时,一切都正确显示。
问题是当我使用下一个代码在数据库中插入查询时:
executeSql(queryStatement: string, params?: Array<string | number>): Promise<any> {
params = params ? params : [];
return new Promise((resolve, reject) => {
this.db.transaction((tx) => {
tx.executeSql(queryStatement, params,
(tx, result) => {
console.log(result); //--> console: SQLResultSet {rows: SQLResultSetRowList, insertId: 5, rowsAffected: 1}
console.log(Object.assign({}, result)); //--> console: {}
resolve(result);
},
(error) => reject(error));
});
});
}
我想做的是使用第一个查询的insertedId,并在下一个查询中使用它。但是正如您所看到的,当 promise 失效时,结果仍然是空的,因此下一次查询将失败,因为没有 Id。
有人知道为什么我有这个计时问题吗?
我该如何解决这个问题,即 promise 等待得到解决直到结果出现?
已经非常感谢你的帮助,因为我真的被这个问题困住了。
亲切的问候
调用函数的函数
execQuery(query: string, params?: Array<string | number>): Promise<number> {
return new Promise((resolve, reject) => {
this.db.executeSql(query, params)
.then((result: any) => {
resolve(result.insertId); //--> result = {}
})
.catch((e) => reject(e));
});
}
您的第二条 console.log 指令显示空对象 ({}) 的原因似乎与 Object.assign() 函数有关,而不是 WebSQL 问题。根据 documentation of Object.assign() function,只有自己的可枚举属性是从源对象复制的。