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
相关产品推荐
相关产品推荐

