From cce6f2c0e70d4e57d11330ee20c6e8aa28252ae8 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 12 Mar 2012 12:18:52 -0700 Subject: [PATCH] Added code to catch SQLiteException errors like missing columns and recommend a reinstall --- .../astrid/notes/EditNoteActivity.java | 9 ++++++++- astrid/res/values/strings-core.xml | 7 +++++++ .../astrid/activity/TaskListFragment.java | 10 +++++++++- .../astrid/service/StartupService.java | 20 ++++++++++++++++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java index dd777b0c3..3d453e0ec 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java @@ -11,6 +11,7 @@ import org.json.JSONObject; import android.app.Activity; import android.content.Intent; +import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.Color; import android.support.v4.app.Fragment; @@ -38,6 +39,7 @@ import android.widget.TextView.OnEditorActionListener; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; @@ -60,6 +62,7 @@ import com.todoroo.astrid.helper.AsyncImageView; import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.helper.ProgressBarSyncResultCallback; import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.sync.SyncResultCallback; @@ -125,7 +128,11 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene } public void loadViewForTaskID(long t){ - task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.REMOTE_ID, Task.TITLE); + try { + task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.REMOTE_ID, Task.TITLE); + } catch (SQLiteException e) { + StartupService.handleSQLiteColumnMissing(ContextManager.getContext(), e); + } if(task == null) { return; } diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 4c1a17bbe..5dbff2b57 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -645,5 +645,12 @@ Astrid is the much loved open-source todo list / task manager designed to help you get stuff done. It features reminders, tags, sync, Locale plug-in, a widget and more. + Corrupted Database + + + Uh oh! It looks like you may have a corrupted database. + If you see this error regularly, we suggest you uninstall, + reinstall, and restore your tasks from a backup by + clicking Menu->Backup->Import Tasks in Astrid. diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index 4ce42846f..d9f6c0e0e 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -18,6 +18,7 @@ import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; +import android.database.sqlite.SQLiteException; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.ActionBar; @@ -81,6 +82,7 @@ import com.todoroo.astrid.reminders.ReminderDebugContextActions; import com.todoroo.astrid.service.AddOnService; import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.TagDataService; @@ -814,8 +816,14 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, filter.sqlQuery, sortFlags, sortSort)); // perform query - TodorooCursor currentCursor = taskService.fetchFiltered( + TodorooCursor currentCursor; + try { + currentCursor = taskService.fetchFiltered( sqlQueryTemplate.get(), null, taskProperties()); + } catch (SQLiteException e) { + StartupService.handleSQLiteColumnMissing(getActivity(), e); + return; + } // set up list adapters taskAdapter = createTaskAdapter(currentCursor); diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index a477710fc..6ada5a0f6 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -16,6 +16,7 @@ import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.database.sqlite.SQLiteException; import android.media.AudioManager; import android.util.Log; import android.widget.Toast; @@ -112,7 +113,12 @@ public class StartupService { Crittercism.setShouldUseAmazonMarket(Constants.MARKET_DISABLED); } - database.openForWriting(); + try { + database.openForWriting(); + } catch (SQLiteException e) { + handleSQLiteColumnMissing(context, e); + return; + } // show notification if reminders are silenced if(context instanceof Activity) { @@ -211,6 +217,18 @@ public class StartupService { hasStartedUp = true; } + public static void handleSQLiteColumnMissing(Context context, final SQLiteException e) { + new AlertDialog.Builder(context) + .setTitle(R.string.DB_corrupted_title) + .setMessage(R.string.DB_corrupted_body) + .setPositiveButton(R.string.DLG_ok, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + throw e; + } + }).create().show(); + } + /** * If database exists, no tasks but metadata, and a backup file exists, restore it */