Try to create columns that crittercism claims are missing at startup time

pull/14/head
Sam Bosley 13 years ago
parent 2535c08e8c
commit c8a0ca505a

@ -139,7 +139,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
try { try {
task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.REMOTE_ID, Task.TITLE); task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.REMOTE_ID, Task.TITLE);
} catch (SQLiteException e) { } catch (SQLiteException e) {
StartupService.handleSQLiteColumnMissing(ContextManager.getContext(), e); StartupService.handleSQLiteError(ContextManager.getContext(), e);
} }
if(task == null) { if(task == null) {
return; return;

@ -6,6 +6,7 @@
package com.todoroo.astrid.dao; package com.todoroo.astrid.dao;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.AbstractDatabase;
@ -335,6 +336,19 @@ public class Database extends AbstractDatabase {
return false; return false;
} }
public void tryAddColumn(Table table, Property<?> column, String defaultValue) {
try {
SqlConstructorVisitor visitor = new SqlConstructorVisitor();
String sql = "ALTER TABLE " + table.name + " ADD " + //$NON-NLS-1$//$NON-NLS-2$
column.accept(visitor, null);
if (!TextUtils.isEmpty(defaultValue))
sql += " DEFAULT " + defaultValue;
database.execSQL(sql);
} catch (SQLiteException e) {
// ignored, column already exists
}
}
/** /**
* Create table generation SQL * Create table generation SQL
* @param sql * @param sql

@ -28,10 +28,12 @@ import android.widget.Toast;
import com.crittercism.app.Crittercism; import com.crittercism.app.Crittercism;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
@ -42,6 +44,7 @@ import com.todoroo.astrid.backup.BackupConstants;
import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.BackupService;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.opencrx.OpencrxCoreUtils; import com.todoroo.astrid.opencrx.OpencrxCoreUtils;
@ -127,8 +130,9 @@ public class StartupService {
try { try {
database.openForWriting(); database.openForWriting();
checkForMissingColumns();
} catch (SQLiteException e) { } catch (SQLiteException e) {
handleSQLiteColumnMissing(context, e); handleSQLiteError(context, e);
return; return;
} }
@ -251,15 +255,32 @@ public class StartupService {
* @param context * @param context
* @param e error that was raised * @param e error that was raised
*/ */
public static void handleSQLiteColumnMissing(Context context, final SQLiteException e) { public static void handleSQLiteError(Context context, final SQLiteException e) {
new AlertDialog.Builder(context) new AlertDialog.Builder(context)
.setTitle(R.string.DB_corrupted_title) .setTitle(R.string.DB_corrupted_title)
.setMessage(R.string.DB_corrupted_body) .setMessage(R.string.DB_corrupted_body)
.setPositiveButton(R.string.DLG_ok, null) .setPositiveButton(R.string.DLG_ok, null)
.create().show(); .create().show();
e.printStackTrace(); e.printStackTrace();
} }
private void checkForMissingColumns() {
// For some reason these properties are missing for some users.
// Make them exist!
try {
TodorooCursor<Task> tasks = taskService.query(Query.select(Task.REMOTE_ID, Task.USER_ID, Task.USER).limit(1));
try {
System.err.println(tasks.getCount());
} finally {
tasks.close();
}
} catch (SQLiteException e) {
database.tryAddColumn(Task.TABLE, Task.REMOTE_ID, "0"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER_ID, "0"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER, null);
}
}
/** /**
* If database exists, no tasks but metadata, and a backup file exists, restore it * If database exists, no tasks but metadata, and a backup file exists, restore it
*/ */

@ -14,6 +14,7 @@ import org.json.JSONObject;
import android.content.Context; import android.content.Context;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
@ -66,11 +67,12 @@ public final class ABTestEventReportingService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
Looper.prepare(); // In case something goes wrong
try { try {
abTestEventDao.createRelativeDateEvents(); abTestEventDao.createRelativeDateEvents();
pushAllUnreportedABTestEvents(); pushAllUnreportedABTestEvents();
} catch (SQLiteException e) { } catch (SQLiteException e) {
StartupService.handleSQLiteColumnMissing(context, e); StartupService.handleSQLiteError(context, e);
} }
} }
}).start(); }).start();

Loading…
Cancel
Save