[mono-android] Exception isn't being caught and is killing my app
Jeremy A. Kolb - ARA/NED
jkolb at ara.com
Wed Oct 3 16:05:26 UTC 2012
I'm trying to make an update to a content provider with a known bad value like so:
view.FindViewById<Button>(Resource.Id.ok).Click +=
(o, e) =>
{
ContentValues values = new ContentValues(5);
values.Put(MinefieldManagementContract.Personnel.Columns.FirstName, this.View.FindViewById<TextView>(Resource.Id.first_name).Text);
values.Put(MinefieldManagementContract.Personnel.Columns.LastName, this.View.FindViewById<TextView>(Resource.Id.last_name).Text);
values.Put(MinefieldManagementContract.Personnel.Columns.Role, this.View.FindViewById<TextView>(Resource.Id.role).Text);
values.Put(MinefieldManagementContract.Personnel.Columns.Skills, this.View.FindViewById<TextView>(Resource.Id.skills).Text);
values.Put(MinefieldManagementContract.Personnel.Columns.CurrentlyActive, this.View.FindViewById<Switch>(Resource.Id.currently_active).Checked);
values.Put("123", "your mom");
try
{
if (this.DataId == -1)
{
// Insert
Android.Net.Uri newUri = this.Activity.ContentResolver.Insert(MinefieldManagementContract.Personnel.ContentUri, values);
this.DataId = long.Parse(newUri.LastPathSegment);
}
else
{
// Update
this.Activity.ContentResolver.Update(
MinefieldManagementContract.MakeItemUri(MinefieldManagementContract.Personnel.ContentUri, this.DataId),
values, null, null);
}
}
catch (Exception ex)
{
Toast toast = Toast.MakeText(this.Activity, "Failed to update database: \n" + ex.Message, ToastLength.Short);
toast.Show();
}
};
Unfortunately this seems to kill the VM:
10-03 12:01:47.487 I/MonoDroid(18173): UNHANDLED EXCEPTION: Android.Database.Sqlite.SQLiteException: Exception of type 'Android.Database.Sqlite.SQLiteException' was thrown.
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Runtime.JNIEnv.CallIntMethod (intptr,intptr,Android.Runtime.JValue[]) [0x00024] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:269
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Database.Sqlite.SQLiteDatabase.Update (string,Android.Content.ContentValues,string,string[]) [0x00054] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.Database.Sqlite.SQLiteDatabase.cs:1812
10-03 12:01:47.487 I/MonoDroid(18173): at MinefieldManagement.Provider.MinefieldDataProvider.Update (Android.Net.Uri,Android.Content.ContentValues,string,string[]) [0x00092] in c:\Projects\MinefieldManagement\MinefieldManagement\MinefieldManagement\Provider\MinefieldDataProvider.cs:111
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Content.ContentProvider.n_Update_Landroid_net_Uri_Landroid_content_ContentValues_Ljava_lang_String_arrayLjava_lang_String_ (intptr,intptr,intptr,intptr,intptr,intptr) [0x0003a] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.Content.ContentProvider.cs:847
10-03 12:01:47.487 I/MonoDroid(18173): at (wrapper dynamic-method) object.ca074a2c-0ca4-400a-8bf2-e1cc207137aa (intptr,intptr,intptr,intptr,intptr,intptr) <IL 0x00024, 0x00073>
10-03 12:01:47.487 I/MonoDroid(18173):
10-03 12:01:47.487 I/MonoDroid(18173): --- End of managed exception stack trace ---
10-03 12:01:47.487 I/MonoDroid(18173): android.database.sqlite.SQLiteException: near "123": syntax error: , while compiling: UPDATE Personnel SET CurrentlyActive=?,Skills=?,Role=?,FirstName=?,LastName=?,123=? WHERE _id=5
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:84)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1810)
10-03 12:01:47.487 I/MonoDroid(18173): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1761)
10-03 12:01:47.487 I/MonoDroid(18173): at minefieldmanagement.provider.MinefieldDataProvider.n_update(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173): at minefieldmanagement.provider.MinefieldDataProvider.update(MinefieldDataProvider.java:57)
10-03 12:01:47.487 I/MonoDroid(18173): at android.content.ContentProvider$Transport.update(ContentProvider.java:219)
10-03 12:01:47.487 I/MonoDroid(18173): at android.content.ContentResolver.update(ContentResolver.java:856)
10-03 12:01:47.487 I/MonoDroid(18173): at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173): at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
10-03 12:01:47.487 I/MonoDroid(18173): at android.view.View.performClick(View.java:3511)
10-03 12:01:47.487 I/MonoDroid(18173): at android.view.View$PerformClick.run(View.java:14105)
10-03 12:01:47.487 I/MonoDroid(18173): at android.os.Handler.handleCallback(Handler.java:605)
10-03 12:01:47.487 I/MonoDroid(18173): at android.os.Handler.dispatchMessage(Handler.java:92)
10-03 12:01:47.487 I/MonoDroid(18173): at android.os.Looper.loop(Looper.java:137)
10-03 12:01:47.487 I/MonoDroid(18173): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-03 12:01:47.487 I/MonoDroid(18173): at java.lang.reflect.Method.invokeNative(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173): at java.lang.reflect.Method.invoke(Method.java:511)
10-03 12:01:47.487 I/MonoDroid(18173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-03 12:01:47.487 I/MonoDroid(18173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-03 12:01:47.487 I/MonoDroid(18173): at dalvik.system.NativeStart.main(Native Method)
10-03 12:01:50.847 W/dalvikvm(18173): JNI WARNING: JNI method called with exception pending
10-03 12:01:50.847 W/dalvikvm(18173): in Lminefieldmanagement/provider/MinefieldDataProvider;.n_update:(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I (CallObjectMethod)
10-03 12:01:50.847 W/dalvikvm(18173): Pending exception is:
10-03 12:01:50.847 I/dalvikvm(18173): android.database.sqlite.SQLiteException: near "123": syntax error: , while compiling: UPDATE Personnel SET CurrentlyActive=?,Skills=?,Role=?,FirstName=?,LastName=?,123=? WHERE _id=5
10-03 12:01:50.847 I/dalvikvm(18173): (raw stack trace not found)
10-03 12:01:50.847 I/dalvikvm(18173): "main" prio=5 tid=1 NATIVE
10-03 12:01:50.847 I/dalvikvm(18173): | group="main" sCount=0 dsCount=0 obj=0x40a74460 self=0x19bb828
10-03 12:01:50.847 I/dalvikvm(18173): | sysTid=18173 nice=0 sched=0/0 cgrp=default handle=1074939016
10-03 12:01:50.857 I/dalvikvm(18173): | schedstat=( 1821164000 190583000 1007 ) utm=149 stm=33 core=0
10-03 12:01:50.857 I/dalvikvm(18173): at minefieldmanagement.provider.MinefieldDataProvider.n_update(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173): at minefieldmanagement.provider.MinefieldDataProvider.update(MinefieldDataProvider.java:57)
10-03 12:01:50.857 I/dalvikvm(18173): at android.content.ContentProvider$Transport.update(ContentProvider.java:219)
10-03 12:01:50.857 I/dalvikvm(18173): at android.content.ContentResolver.update(ContentResolver.java:856)
10-03 12:01:50.857 I/dalvikvm(18173): at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173): at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
10-03 12:01:50.857 I/dalvikvm(18173): at android.view.View.performClick(View.java:3511)
10-03 12:01:50.857 I/dalvikvm(18173): at android.view.View$PerformClick.run(View.java:14105)
10-03 12:01:50.857 I/dalvikvm(18173): at android.os.Handler.handleCallback(Handler.java:605)
10-03 12:01:50.857 I/dalvikvm(18173): at android.os.Handler.dispatchMessage(Handler.java:92)
10-03 12:01:50.857 I/dalvikvm(18173): at android.os.Looper.loop(Looper.java:137)
10-03 12:01:50.857 I/dalvikvm(18173): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-03 12:01:50.857 I/dalvikvm(18173): at java.lang.reflect.Method.invokeNative(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173): at java.lang.reflect.Method.invoke(Method.java:511)
10-03 12:01:50.857 I/dalvikvm(18173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-03 12:01:50.857 I/dalvikvm(18173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-03 12:01:50.857 I/dalvikvm(18173): at dalvik.system.NativeStart.main(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173):
10-03 12:01:50.857 E/dalvikvm(18173): VM aborting
10-03 12:01:50.857 I/mono (18173): Stacktrace:
10-03 12:01:50.857 I/mono (18173):
10-03 12:01:50.867 I/mono (18173): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr) [0x00000] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:129
10-03 12:01:50.867 I/mono (18173): at Android.App.Fragment.get_Activity () [0x0002d] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.App.Fragment.cs:228
10-03 12:01:50.867 I/mono (18173): at (wrapper runtime-invoke) <Module>.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>
At which point I end up in the catch block above and this.Activity is raising a NullReferenceException. I'm a bit confused as to why the first exception isn't propogating up to the catch block. My query provider's update looks like:
public override int Update(Android.Net.Uri uri, ContentValues values, string selection, string[] selectionArgs)
{
SQLiteDatabase db = this._db.WritableDatabase;
string table;
switch(UriMatcher.Match(uri))
{
case Personnel:
table = MinefieldManagementSqlLiteHelper.Tables.Personnel;
break;
case PersonnelId:
table = MinefieldManagementSqlLiteHelper.Tables.Personnel;
selection = this.BuildItemWhereClause(uri.LastPathSegment, selection);
break;
case Equipment:
table = MinefieldManagementSqlLiteHelper.Tables.Equipment;
break;
case EquipmentId:
table = MinefieldManagementSqlLiteHelper.Tables.Equipment;
selection = this.BuildItemWhereClause(uri.LastPathSegment, selection);
break;
default:
throw new Java.Lang.IllegalArgumentException("Unknown URI " + uri);
}
int rowsAffected = db.Update(table, values, selection, selectionArgs); <-- This is where it fails as expected.
Context.ContentResolver.NotifyChange(uri, null);
return rowsAffected;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/monodroid/attachments/20121003/7fe644b7/attachment-0001.html>
More information about the Monodroid
mailing list