React Native开发中如何向SQLite数据库插入经纬度数据
SQLite存储经纬度问题解决方案
经纬度数据类型选择
SQLite存储经纬度优先使用REAL类型即可,双精度浮点数的精度完全满足经纬度的米级以下精度需求,也方便后续做距离计算等数值操作,无需转成TEXT存储。
问题根因
- 表结构变更未生效
你使用了CREATE TABLE IF NOT EXISTS语句建表,如果本地已经存在旧版本的Users表(不含Latitude/Longitude字段),修改后的建表语句不会更新已有表结构,插入数据时会因为找不到对应列报错,插入失败后自然查询不到结果。新增Longitude字段时复现问题也是同样的原因。 - 异步逻辑时序错误
Geolocation.getCurrentPosition是异步回调API,你在回调外直接使用lat变量时,大概率回调还未执行,lat还是旧值甚至undefined,会导致插入参数异常。 - 错误没有被正确捕获:插入操作的异常如果没有被打印,会无法快速定位问题。
具体解决步骤
1. 处理表结构变更
- 开发阶段:直接卸载应用重装,清空本地旧的SQLite数据库,让新的建表语句直接生效。
- 上线版本:需要做表结构迁移,执行
ALTER TABLE语句新增列,避免影响已有用户数据。
2. 修正异步逻辑
将获取位置的回调API包装为Promise,确保拿到经纬度后再执行数据库插入操作。
3. 修正后的代码示例
// 建表逻辑:先建表,再做列迁移兼容旧版本 const createTable = () => { db.transaction((tx) => { tx.executeSql( "CREATE TABLE IF NOT EXISTS Users " + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, Title TEXT, Description TEXT, Latitude REAL, Longitude REAL);" ) // 旧表没有Longitude列时自动新增 tx.executeSql("ALTER TABLE Users ADD COLUMN IF NOT EXISTS Longitude REAL") }) } // 把定位API包装成Promise,适配async/await语法 const getCurrentPosition = () => { return new Promise((resolve, reject) => { Geolocation.getCurrentPosition(info => resolve(info.coords), reject) }) } const setData = async () => { try { dispatch(setTitle(title)) // 等待获取到经纬度后再往下执行 const coords = await getCurrentPosition() const lat = coords.latitude const lng = coords.longitude dispatch(setLat(lat)) dispatch(setLng(lng)) console.log('待插入的纬度:', lat, '待插入的经度:', lng) await db.transaction(async (tx) => { await tx.executeSql( "INSERT INTO Users (Title, Latitude, Longitude) VALUES (?,?,?)", [title, lat, lng] ) }) // 查询数据 await db.transaction(async (tx) => { await tx.executeSql( "SELECT Title, Latitude, Longitude FROM Users", [], (tx, results) => { const len = results.rows.length if (len > 0) { for (let i = 0; i < len; i++) { const item = results.rows.item(i) console.log('userTitle: ', item.Title) console.log('Latitude from database: ', item.Latitude) console.log('Longitude from database: ', item.Longitude) } } } ) }) } catch (error) { console.log('操作出错:', error) } }
内容的提问来源于stack exchange,提问作者Emanuele Ago
相关产品推荐
相关产品推荐

