点击地图保存经纬度到SQLite数据库无报错但存储失败求助
问题原因及修复方案
核心问题1:无插入结果校验
SQLiteDatabase.insert() 方法本身不会抛出异常,插入失败时仅会返回 -1 作为结果标识,你当前代码没有对返回值做判断,因此无法感知插入失败的情况。
优先修改addNewLocation方法增加日志和结果校验:
public void addNewLocation(String latLong) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(NAME_LAT, latLong); // 接收插入结果 long insertResult = db.insert(TABLE_NAME, null, values); if (insertResult == -1) { // 插入失败时打印日志排查 Log.e("DB_ERROR", "经纬度插入失败,插入值:" + latLong); } else { Log.d("DB_SUCCESS", "经纬度插入成功,行ID:" + insertResult); } db.close(); }
常见触发场景
- 旧数据库残留:如果你之前运行过程序创建过同名数据库,后续修改了表结构但没有升级
DB_VERSION也没有清除旧数据,会导致表结构不匹配插入失败。
修复方式:直接卸载测试应用,清除本地缓存的旧数据库文件后重新运行即可。 - 数据库查看方式错误:安卓应用的SQLite文件默认存储在内部沙箱目录,如果你导出的不是当前运行应用的最新数据库文件,会出现查不到数据的误判。
验证方式:新增查询方法直接读取数据库内数据,确认存储状态:
public void queryAllLocations() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); Log.d("DB_COUNT", "当前表内总数据条数:" + cursor.getCount()); cursor.close(); db.close(); }
在addNewLocation执行完成后调用该方法,查看日志输出的条数即可确认是否插入成功。
额外优化建议
你当前将纬度和经度拼接为一个字符串存储,后续使用时需要拆分非常不方便,建议修改表结构分为两个字段分别存储纬度、经度数值:
// DBHandler内新增字段常量 private static final String LAT_COL = "latitude"; private static final String LNG_COL = "longitude"; // onCreate内修改建表语句 @Override public void onCreate(SQLiteDatabase db) { String query = "CREATE TABLE " + TABLE_NAME + " (" + ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LAT_COL + " REAL, " + LNG_COL + " REAL)"; db.execSQL(query); } // 修改新增方法,分开存储数值 public void addNewLocation(double lat, double lng) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(LAT_COL, lat); values.put(LNG_COL, lng); long insertResult = db.insert(TABLE_NAME, null, values); // 省略结果校验逻辑 db.close(); }
内容的提问来源于stack exchange,提问作者Allrounder
相关产品推荐
相关产品推荐

