我有一个Ionic应用程序,我在其中使用数据库。我想用文件的内容填充这个数据库
这部分我开始工作了。我想创建一个DB.ready()
事件,就像$ionicPlatform.ready()
或document.ready()
一样,因为我需要等到数据库加载到我查询它为止。
我是Ionic的新手,也是Promises的概念,所以它可能很简单。
我已经让它在Android中运行,但iOS在查询中返回错误,“ someTablename不存在”。我已经放置了多个console.log()
,根据这些,一切都很好。
有人能告诉我哪个部分不正确,或者其他方法如果在这种情况下更常见(再次,我是新的,所以不知道什么是常见的)?
我希望每次查询都会记录“query
”,但它没有这样做,那是否显着?
// L35_DB - Databaseclass for apps
.factory('L35_DB', ['$ionicPlatform','$cordovaFile','$cordovaSQLite', function($ionicPlatform, $cordovaFile,$cordovaSQLite) {
var L35_DB = {db_start : false};
//-------------------------------------
DB_READY = new Promise(function(resolve,reject){
console.log("query");
if( L35_DB.db_start ){console.log("b"); resolve("Stuff worked!"); }
else{
var filename='fileWithDB.db';
$ionicPlatform.ready(function() {
if( window.cordova ){
return window.plugins.sqlDB.copy(filename, 0,
function(info){ loadDB(filename).then( function(){ console.log("First load", info); resolve("DB loaded?"); }) },
function(info){ loadDB(filename).then( function(){ console.log("Other loads", info); resolve("DB loaded?"); }) }
);
}
});
}
});
//-------------------------------------
// Load the file
function loadDB(filename){
var loading = new Promise(function(resolve,reject){
db = window.sqlitePlugin.openDatabase(
{name: filename, location: 'default'},
function(){
console.log("loadDB success"); // <--- fired
L35_DB.db_start = true; // true, so next call we don't do all this
resolve("DB ready loading");
},
function(err){ reject(err);}
);
});
return loading;
}
//-------------------------------------
// Query -
var _query = function(query,values){
if( !L35_DB.db_start ){
console.error("DB not init");
return false;
}
else if( window.cordova ){
values = values || [];
var actualQuery = new Promise(function(resolve,reject){
db.executeSql(query, values, resolve, reject);
})
return actualQuery;
}
}
//-------------------------------------
return {
query : _query
};
}])
在我的应用程序中,我做了:
DB_READY.then(function () {
L35_DB.query("SELECT * FROM systems").then(function (result) {
// Something something something darkside
})
})
答案 0 :(得分:0)
经过大量的测试和挖掘后,结果window.plugins.sqlDB.copy()
成了罪魁祸首。
第二个值,位置,可以更改。它默认为0
,但对于iOS,它必须为2
。在此更改之后,一切都按预期完成。
这个函数应该为Android和iOS预加载数据库,假设实际上有点太早了。