PhoneGap应用executeSQL函数失效求助:无报错但数据库插入未执行
executeSQL Issue Hey there! Let’s tackle why your executeSQL function isn’t populating locationStr—even though console logs are working and you’re not seeing explicit errors. This is a common pitfall with asynchronous database operations, so let’s break down the most likely fixes:
1. You’re Falling for Asynchronous Execution
SQLite’s executeSQL runs asynchronously, meaning any code that depends on locationStr will run before the query finishes if it’s outside the callback. That’s probably why locationStr is empty.
Example of the Problem:
let locationStr; db.transaction(function(tx) { tx.executeSQL('SELECT location FROM your_table WHERE ...', [], function(tx, results) { locationStr = results.rows.item(0).location; }); }); console.log(locationStr); // Undefined! The query hasn't finished yet.
Fix: Move Dependent Logic Inside the Callback
Put your Geoprocessor initialization and any code that uses locationStr directly inside the executeSQL success callback. Don’t forget to add an error callback to catch silent failures:
db.transaction(function(tx) { tx.executeSQL( 'SELECT location FROM your_table WHERE your_condition = ?', [userInputValue], // Bind your user input here securely function(tx, results) { // First, confirm we have results if (results.rows.length > 0) { const locationStr = results.rows.item(0).location; console.log("Successfully retrieved location:", locationStr); // Initialize your Geoprocessor HERE, now that locationStr has a value window.gp_chart = new Geoprocessor("http://ourserver.com/arcgis/rest/se..."); // Run any other logic that needs locationStr here } else { console.log("No matching records found for the input"); } }, function(tx, error) { // Catch hidden SQL errors you might be missing console.error("SQL Query Failed:", error.message); } ); });
2. Database/Table Initialization Issues
You mentioned declaring the database at the top, but did you confirm it’s opening successfully and your table exists? Silent failures here will break queries.
Verify Database & Table Setup
Make sure you’re waiting for the deviceready event (critical for PhoneGap/Cordova APIs) and validating table creation:
document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { // Open database only after device is ready const db = window.openDatabase("YourAppDB", "1.0", "Your App Database", 2 * 1024 * 1024); // Confirm table exists (create if not) db.transaction(function(tx) { tx.executeSQL( 'CREATE TABLE IF NOT EXISTS user_inputs (id INTEGER PRIMARY KEY, location TEXT, input_value TEXT)', [], function() { console.log("Table initialized successfully"); }, function(tx, err) { console.error("Table creation failed:", err); } ); }); // Run your query logic here after table setup }
3. Query Logic or Parameter Mistakes
Double-check your SQL statement:
- Did you spell column/table names correctly?
- Are you binding user input parameters properly (using
?placeholders to avoid SQL injection)? - Is your WHERE clause targeting the right data?
Add a check for result row count to confirm you’re getting data back:
// Inside executeSQL success callback if (results.rows.length === 0) { console.warn("Query returned no results—check your WHERE clause or input data"); }
4. Cordova SQLite Plugin Compatibility
Ensure you’re using the official Cordova SQLite plugin, not the browser’s Web SQL (which has inconsistent support across PhoneGap platforms):
# Reinstall the plugin to fix potential corruption cordova plugin remove cordova-sqlite-storage cordova plugin add cordova-sqlite-storage
内容的提问来源于stack exchange,提问作者Bill Hambone

