调用expo-sqlite的getFirstAsync随机报错NativeDatabase.prepareAsync被拒绝求助
检查数据库实例的生命周期管理
随机出现的“已释放共享对象”错误,核心原因大概率是userDb实例被提前销毁或回收后,异步的getFirstAsync调用还在执行。比如在React组件里,如果userDb是组件内创建的,组件卸载时没正确关闭连接,后续挂起的异步操作就会触发这个错误。要保证数据库实例在使用全程有效,不用时显式调用closeAsync()关闭,且关闭后绝对不能再复用这个实例。验证
query参数的有效性
错误提示里提到第二个参数转不成NativeStatement,说明传给getFirstAsync的query可能不是合法的查询语句对象,或者在传递过程中被意外修改成了整数这类无效值。要确认query是通过userDb.prepareAsync()正确创建的,且调用getFirstAsync时没被篡改或提前回收。排查异步竞态条件
问题随机出现,很大概率是竞态导致:比如调用getFirstAsync的同时,有其他代码在关闭数据库、销毁userDb实例,或者重复复用同一个query对象(不少SQLite库不允许同一个语句对象并发执行)。要确保同一时间只有一个异步操作在使用userDb或query,必要时用锁或者队列控制并发。检查Expo SQLite版本
部分旧版本的expo-sqlite存在资源回收的bug,会导致已释放的对象被意外引用。试试升级到最新稳定版,看能不能解决这个随机问题。添加有效性检查与错误捕获
调用getFirstAsync前,先检查userDb是否处于有效状态(比如加个自定义标志位),同时用try-catch包裹调用,既避免崩溃,也能在错误发生时记录更多上下文(比如当前userDb状态、query的具体内容),方便定位问题。
内容的提问来源于stack exchange,提问作者Chunke

