我在存储旅程跟踪应用的位置数据时遇到问题。我在我的应用程序中使用加速度计和GPS位置。所有数据都存储在手机sqlite数据库中。加速度计的采样率为25ms,GPS为3000ms。因此,对于我放入数据库的每120个加速器读数,插入了一个GPS读数。
这完美地工作了大约30秒然后应用程序奇怪地停止添加GPS读数,但它继续添加加速度计读数。
以下是我的手表功能,每3秒钟从GPS获取读数。我使用它的原因是因为我以前遇到过插件的监视功能问题。
SetupWatch功能代码:
var activeWatch=null;
// sets up the interval at the specified frequency
function setupWatch(freq) {
activeWatch = setInterval(watchLocation, freq);
}
// stop watching
function logout() {
clearInterval(activeWatch);
}
观看功能代码:
function watchLocation() {
var gcp = navigator.geolocation.getCurrentPosition(
// Success
function(position){
newlongitude = position.coords.longitude;
//alert("New "+newlongitude)
newlatitude = position.coords.latitude;
newSpeed = position.coords.speed;
//alert(position.coords.speed);
var timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');
//alert(timestamp);
insertDB(track_id, newlongitude,newlatitude,newSpeed,timestamp,row);
row+=120;
},
// Error
function(error){
alert(error.message);
}, {
enableHighAccuracy: true
});
}
以下是我用于将GPS读数插入数据库的功能。我使用sql update语句来更新已经使用GPS读数和当前罗盘方向指示的加速度计读数创建的行。
InsertDB功能代码:
function insertDB(trackID, longi,lat,speed, time,arow){
//alert(Longi + " " + Lat);
watch_Comp = navigator.compass.getCurrentHeading(onSuccess, onError,compassOptions);
function onSuccess(heading) {
newDir = heading.magneticHeading;
//alert(newDir);
if(arow===0){
arow=1;
}
//alert("update row "+arow);
db.transaction(function(tx){
tx.executeSql('UPDATE DEMO SET longitude = '+'\''+longi+'\''+', latitude = '+'\''+lat+'\''+
', speed = '+'\''+speed+'\''+ ', time = '+'\''+time+'\''+', direction = '+'\''+newDir+'\''+
' WHERE uniqueID = ' + '\''+arow+'\'');
}, errorCB);
};
function onError(error) {
alert('CompassError: ' + error.code);
};
var compassOptions = {
frequency: 3000
};
任何人都知道可能导致这种情况发生的原因是什么?
答案 0 :(得分:0)
我明白了。它停止更新GPS数据的原因是它还没有创建它试图更新的行。当我开始跟踪我的旅程时,我首先启动加速度计手表,然后开始插入加速度计读数。然后我启动GPS手表,更新使用GPS读数创建的加速度计行。
问题在于加速度计手表必须对数据库进行多次插入,在3秒内有点慢,所以最终GPS手表赶上它并试图更新一行还没有创建。一旦GPS手表通过加速度计手表,我无法存储GPS读数。
解决这个问题的方法是将GPS手表减慢到3.5秒的采样率,或者从更新'加速器行排到'插入'。虽然如果将其更改为插入,则数据库中每三秒标记将有两行。这就是为什么我把它改为首先更新的原因。