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

Android更新Google Calendar事件时SQLiteException报错求助

我来帮你排查这个Google Calendar更新失败的问题,从你的报错日志和代码来看,有几个常见的原因和对应的解决方法,咱们一步步来梳理:

1. 最可能的原因:权限缺失

Android 6.0(API 23)及以上版本,WRITE_CALENDAR属于危险权限,必须动态申请,只在Manifest里声明是不够的。你的代码里完全没处理权限申请,这会导致更新操作被系统拒绝,进而触发底层的SQLiteException。

解决步骤:

首先在AndroidManifest.xml里添加权限声明:

<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CALENDAR" />

然后在Status_Check中添加动态权限申请逻辑,把原来的JSON处理逻辑放到权限通过后执行:

private static final int REQUEST_CALENDAR_PERMISSIONS = 1001;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_status__check);

    // 先检查日历权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR},
                REQUEST_CALENDAR_PERMISSIONS);
    } else {
        // 权限已获取,处理JSON数据
        processCalendarData();
    }
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CALENDAR_PERMISSIONS) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            processCalendarData();
        } else {
            Toast.makeText(this, "需要日历权限才能更新日程", Toast.LENGTH_LONG).show();
        }
    }
}

// 把原来的JSON解析和更新逻辑移到这里
private void processCalendarData() {
    String jsonString = getIntent().getStringExtra("rootJson");
    try {
        JSONObject jsonObjects = new JSONObject(jsonString);
        jsonArray_Update = jsonObjects.getJSONArray("UPDATE_SCHEDULE");
        Toast.makeText(Status_Check.this, "jsonArray_Update"+jsonArray_Update, Toast.LENGTH_LONG).show();
        UpdateCalendarEvent(jsonArray_Update);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
2. 验证Event_id的有效性

你从JSON获取的Event_id[L]可能不是合法的日历事件ID,或者该ID对应的事件已经被删除,或者不属于你硬编码的CALENDAR_ID=1的日历。

解决步骤:

在执行更新前,先验证事件ID是否存在:

long eventId = Long.parseLong(Event_id[L]);
Uri updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId);

// 查询该ID是否存在
Cursor cursor = getContentResolver().query(updateUri, new String[]{CalendarContract.Events._ID}, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
    // 事件存在,执行更新
    int rows = getContentResolver().update(updateUri, event, null, null);
    Log.d("CalendarUpdate", "成功更新" + rows + "条记录");
} else {
    Toast.makeText(this, "无效的事件ID:" + Event_id[L], Toast.LENGTH_SHORT).show();
}
if (cursor != null) cursor.close();
3. 时间戳计算可能出错

你用Calendar.HOUR(12小时制)结合AM/PM来设置时间,容易出现逻辑错误。建议改用Calendar.HOUR_OF_DAY(24小时制)来设置小时,避免AM/PM判断失误。

修改时间戳生成逻辑:

// 替换开始时间的设置代码
Calendar beginTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));
// 直接用24小时制设置:年、月、日、时、分、秒
beginTime.set(syear, smonth, sdate, shour, sminute, sseconds);
beginTime.set(Calendar.MILLISECOND, smilli);
startMillis = beginTime.getTimeInMillis();

// 结束时间同理
Calendar endTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));
endTime.set(eyear, emonth, edate, ehour, eminute, eseconds);
endTime.set(Calendar.MILLISECOND, emilli);
endMillis = endTime.getTimeInMillis();
4. 捕获更详细的错误信息

在更新代码处添加异常捕获,打印具体错误原因,方便排查:

try {
    int rows= getContentResolver().update(updateUri, event, null, null);
    Log.i("UpdateResult", "更新行数:" + rows);
} catch (SQLiteException e) {
    e.printStackTrace();
    Log.e("UpdateError", "更新失败详情:" + e.getMessage());
    Toast.makeText(this, "更新失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}

按照以上步骤排查,应该能解决你的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:30