我正在尝试使用SQLite插件构建Cordova / angular应用程序以使其脱机工作,但是我对查询的承诺和异步查询遇到了很多麻烦,这是我的情况:
我有5个表配置如下:
具有ID,标题,template_id和主体的表页面具有ID和标记的表菜单具有ID,page_id和menu_id的表PageMenus,以将具有ID menu_id和主体的页面和菜单表MeniItems与教导菜单中具有“ actual”元素的ID和标签以选择正确的视图
出于兼容性原因(我为webapp和移动应用程序使用了相同的代码,并且为webapp使用了我调用我的API的代码,而在移动设备上我下载了设备上的所有内容)我需要以以下格式检索页面:
{
"id": 1
"body": "Welcome to the homepage",
"title": "Homepage",
"template_tag": "tab",
"menus": [
{
"id": 3,
"tag": "home_menu",
"menu_items": [
{
"menu_id": 3,
"body": "Movie"
},
{
"menu_id": 3,
"body": "Restaurant"
},
{
"menu_id": 3,
"body": "Messages"
},
{
"menu_id": 3,
"body": "Systems"
}
]
},
{
"id": 62,
"tag": "user_menu",
"menu_items": [
{
"menu_id": 62,
"body": "About"
},
{
"menu_id": 62,
"body": "Updates"
},
{
"menu_id": 62,
"body": "Help"
},
{
"menu_id": 62,
"body": "Reset Password"
},
{
"menu_id": 62,
"body": "Report/ Feedback"
}
]
}
]
}
我已经能够获得正确的格式,但是我的问题是控制器在解决之前尝试访问菜单的主体,所以我得到未定义的错误,这是我当时在工厂使用的代码:
return {
getHomePage: function() {
// other function
},
getPage: function(id) {
var results = $q.defer();
function request() {
var res = {};
var queryPage = "SELECT pages.id, pages.body, pages.title, templates.tag AS template_tag FROM pages JOIN templates ON pages.template_id = templates.id WHERE pages.id = ?";
$cordovaSQLite.execute(db, queryPage, [id]).then(function(page) {
res = page.rows.item(0);
res.menus = [];
var queryMenus = "SELECT menus.id, menus.tag FROM menus JOIN page_menus ON menus.id = page_menus.menu_id WHERE page_menus.page_id = ?";
$cordovaSQLite.execute(db, queryMenus, [res.id]).then(function(menus) {
for (var i = 0; i < menus.rows.length; i++) {
var menu = {
id: menus.rows.item(i).id,
tag: menus.rows.item(i).tag,
menu_items: []
};
var queryMenuItems = "SELECT * FROM menu_items JOIN menus ON menu_items.menu_id = menus.id where menus.id = ?"
$cordovaSQLite.execute(db, queryMenuItems, [menus.rows.item(i).id]).then(function(menu_items) {
for (var i = 0; i < menu_items.rows.length; i++) {
menu.menu_items.push(menu_items.rows.item(i));
}
});
res.menus.push(menu);
};
results.resolve(res);
});
});
};
request();
return results.promise;
},
getMedia: function(id) {
// other function
}
};
这就是我最终要做的事情(即使我认为这对其他人没有真正的帮助,因为我很大程度上依赖于数据库的结构,所以我也会发布它):
var promisePage = $cordovaSQLite.execute(db, "SELECT p.*, t.tag AS template_tag FROM pages AS p JOIN templates AS t ON p.template_id = t.id WHERE p.id = ?", [id]);
var promiseMenus = $cordovaSQLite.execute(db, "SELECT m.* FROM menus AS m JOIN page_menus AS pm ON m.id = pm.menu_id WHERE pm.page_id = ?", [id]);
var promiseMenuItems = $cordovaSQLite.execute(db, "SELECT mi.* FROM menu_items AS mi JOIN menus AS m ON mi.menu_id = m.id JOIN page_menus AS pm ON pm.menu_id = m.id WHERE pm.page_id = ?", [id]);
return $q.all([promisePage, promiseMenus, promiseMenuItems]).then(function(data) {
var page = data[0].rows.item(0);
var menus = data[1];
var menuItems = data[2];
// here there is some boring code to construct the page
return page;
获得页面后,我不再并行查询数据库中的菜单和菜单项,而是并行查询所有三个元素,然后在$ q.all中完成所有工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句