You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native开发中如何向SQLite数据库插入经纬度数据

SQLite存储经纬度问题解决方案

经纬度数据类型选择

SQLite存储经纬度优先使用REAL类型即可,双精度浮点数的精度完全满足经纬度的米级以下精度需求,也方便后续做距离计算等数值操作,无需转成TEXT存储。

问题根因

  1. 表结构变更未生效
    你使用了CREATE TABLE IF NOT EXISTS语句建表,如果本地已经存在旧版本的Users表(不含Latitude/Longitude字段),修改后的建表语句不会更新已有表结构,插入数据时会因为找不到对应列报错,插入失败后自然查询不到结果。新增Longitude字段时复现问题也是同样的原因。
  2. 异步逻辑时序错误
    Geolocation.getCurrentPosition是异步回调API,你在回调外直接使用lat变量时,大概率回调还未执行,lat还是旧值甚至undefined,会导致插入参数异常。
  3. 错误没有被正确捕获:插入操作的异常如果没有被打印,会无法快速定位问题。

具体解决步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:45:01