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

Android中如何实现SQLite数据库的插入及更新操作?

SQLite 实现指定userID存在更新、不存在插入方案

前置条件

首先需要为userID字段添加唯一约束,可以直接将该字段设为主键,或者单独加UNIQUE约束,这是触发冲突判断的基础。建表示例如下:

CREATE TABLE IF NOT EXISTS user_local_data (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    -- 其他需要存储的字段示例
    user_name TEXT,
    user_config TEXT,
    last_update_time INTEGER
);

方案1:官方原生UPSERT(推荐,SQLite 3.24.0及以上版本支持)

SQLite 从3.24.0开始支持标准的INSERT ... ON CONFLICT语法,原子操作无并发问题,单次请求即可完成逻辑,同时天然支持首次新增的场景:

INSERT INTO user_local_data (user_id, user_name, user_config, last_update_time)
VALUES (1001, "测试用户", '{"theme":"dark","notice":true}', 1718000000)
-- 触发user_id唯一约束冲突时执行更新
ON CONFLICT(user_id) DO UPDATE SET
    user_name = excluded.user_name,
    user_config = excluded.user_config,
    last_update_time = excluded.last_update_time;

说明:excluded是SQLite内置关键字,指代本次尝试插入、但触发冲突的行数据,不需要重复传入参数。

方案2:兼容旧版本SQLite的两步法

如果使用的SQLite版本低于3.24.0,可以先执行更新,根据影响行数判断是否需要执行插入:

# 以Python sqlite3库为例,其他语言逻辑同理
import sqlite3

db_conn = sqlite3.connect("your_database.db")
cursor = db_conn.cursor()

# 传入待保存的数据
target_user_id = 1001
save_data = ("测试用户", '{"theme":"dark","notice":true}', 1718000000, target_user_id)

# 第一步先执行更新
cursor.execute("""
UPDATE user_local_data 
SET user_name = ?, user_config = ?, last_update_time = ?
WHERE user_id = ?
""", save_data)

# 影响行数为0说明没有对应user_id,执行插入
if cursor.rowcount == 0:
    insert_data = (target_user_id, "测试用户", '{"theme":"dark","notice":true}', 1718000000)
    cursor.execute("""
    INSERT INTO user_local_data (user_id, user_name, user_config, last_update_time)
    VALUES (?, ?, ?, ?)
    """, insert_data)

db_conn.commit()
db_conn.close()

注意事项

  • 两种方案都支持首次存储时自动执行插入,不需要额外做表空判断
  • 优先使用方案1,原子操作不会出现并发场景下插入重复数据的问题

内容的提问来源于stack exchange,提问作者Malhotra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:05