ForceClose Error in onClick event to save something into the database
<p>I got an error while defining <code>onClick</code> event in my Layout.<br>
In my code I would like that upon clicking, it should save my stuff in my own database, but I allways get a "Force Close Error" and I don't why.</p>

<p>I tried to find out what the problem is,  if I omit the database thing then it works and goes to the other site.</p>

<p>Here's the code of my Activity:</p>

<pre><code>package de.retowaelchli.filterit;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioGroup;

import de.retowaelchli.filterit.database.ADFilterDBAdapter;


public class ADFilterConfigActivity extends Activity {

    //Variablen deklaration
    private ADFilterDBAdapter mDbHelper;
    private String name;
    private String keyword;
    private String cache;
    private String save = "";


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.autodelete_config);
        radiobuttoncheck();

        //Hier wir die Datenbank aufgerufen
        mDbHelper = new ADFilterDBAdapter(this);
        mDbHelper.open();


        //Hier werden die EditTextfelder gesucht
        EditText edtTextName=(EditText )findViewById(R.id.ADConfigName);
        EditText edtTextKeyword=(EditText )findViewById(R.id.ADConfigKeyword);

        //Hier wird der Inhalt der EditText boxen in einen String gespeichert
        name = edtTextName.getText().toString();
        keyword = edtTextKeyword.getText().toString();
        }

        private void radiobuttoncheck() {

        //Hier wird ausgewertet welcher Button geklickt wurde
        RadioGroup rg = (RadioGroup) findViewById(R.id.adcachegroup);
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            public void onCheckedChanged(RadioGroup group, final int checkedId) {
                switch (checkedId) {
                case R.id.adcache_true:
                    save = new StringBuilder(save).append("true").toString();
                    cache = save.toString();

                    break;
                case R.id.adcache_false:
                    save = new StringBuilder(save).append("false").toString();
                    cache = save.toString();

                    break;
                        }
                }
            });
        }
        //Hier werden die Daten in die Datenbank geschreiben und es wird aufs alte register verwiesen
        public void onClickADConfigSave(){

            mDbHelper.createADFilter(name, keyword, cache);

            final Intent i = new Intent(this, ADeleteActivity.class);
            startActivity(i);

        }
 }
</code></pre>

<p>So here is the Code of my DataBase Adapter:</p>

<pre><code>package de.retowaelchli.filterit.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class ADFilterDBAdapter {

        public static final String ROW_ID = "_id";
        public static final String NAME = "name";
        public static final String KEYWORD = "keyword";
        public static final String CACHE = "cache";

        private static final String DATABASE_TABLE = "adfilter";

        private DatabaseHelper mDbHelper;
        private SQLiteDatabase mDb;

        private final Context mCtx;

        private static class DatabaseHelper extends SQLiteOpenHelper {

            DatabaseHelper(Context context) {
                super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION);
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            }
        }

        /**
         * Constructor - takes the context to allow the database to be
         * opened/created
         * 
         * @param ctx
         *            the Context within which to work
         */
        public ADFilterDBAdapter(Context ctx) {
            this.mCtx = ctx;
        }

        /**
         * Open the cars database. If it cannot be opened, try to create a new
         * instance of the database. If it cannot be created, throw an exception to
         * signal the failure
         * 
         * @return this (self reference, allowing this to be chained in an
         *         initialization call)
         * @throws SQLException
         *             if the database could be neither opened or created
         */
        public ADFilterDBAdapter open() throws SQLException {
            this.mDbHelper = new DatabaseHelper(this.mCtx);
            this.mDb = this.mDbHelper.getWritableDatabase();
            return this;
        }

        /**
         * close return type: void
         */
        public void close() {
            this.mDbHelper.close();
        }

        /**
         * Create a new car. If the car is successfully created return the new
         * rowId for that car, otherwise return a -1 to indicate failure.
         * 
         * @param name
         * @param model
         * @param year
         * @return rowId or -1 if failed
         */
        public long createADFilter(String name, String keyword, String cache){
            ContentValues initialValues = new ContentValues();
            initialValues.put(NAME, name);
            initialValues.put(KEYWORD, keyword);
            initialValues.put(CACHE, cache);
            return this.mDb.insert(DATABASE_TABLE, null, initialValues);
        }

        /**
         * Delete the car with the given rowId
         * 
         * @param rowId
         * @return true if deleted, false otherwise
         */
        public boolean deleteADFilter(long rowId) {

            return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) &gt; 0; //$NON-NLS-1$
        }

        /**
         * Return a Cursor over the list of all cars in the database
         * 
         * @return Cursor over all cars
         */
        public Cursor getAllADFilter() {

            return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
                    NAME, KEYWORD, CACHE }, null, null, null, null, null);
        }

        /**
         * Return a Cursor positioned at the car that matches the given rowId
         * @param rowId
         * @return Cursor positioned to matching car, if found
         * @throws SQLException if car could not be found/retrieved
         */
        public Cursor getADFilter(long rowId) throws SQLException {

            Cursor mCursor =

            this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME,
                    KEYWORD, CACHE}, ROW_ID + "=" + rowId, null, null, null, null, null);
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }

        /**
         * Update the car.
         * 
         * @param rowId
         * @param name
         * @param keyword
         * @param cache
         * @return true if the note was successfully updated, false otherwise
         */
        public boolean updateADFilter(long rowId, String name, String keyword,
                String cache){
            ContentValues args = new ContentValues();
            args.put(NAME, name);
            args.put(KEYWORD, keyword);
            args.put(CACHE, cache);

            return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) &gt;0; 
        }

    }
</code></pre>

<p>Here is my Layout-File:</p>

<pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:weightSum="1"&gt;

        &lt;TextView 
        style="@style/NormalFont"
        android:text="@string/adconfig"     
        android:layout_weight="0.05" 
        android:clickable="false"
        /&gt;

        &lt;TextView
            style="@style/SmallFont"
            android:text="@string/adname"
            android:layout_weight="0.03" /&gt;
        &lt;EditText 
            android:layout_width="match_parent" 
            android:id="@+id/ADConfigName" 
            android:layout_weight="0.05" 
            android:layout_height="25dp"
            android:layout_marginBottom="20dp"&gt;
            &lt;requestFocus&gt;&lt;/requestFocus&gt;
        &lt;/EditText&gt;

        &lt;TextView
            style="@style/SmallFont"
            android:text="@string/adkeyword"
            android:layout_weight="0.03"
            /&gt;
        &lt;EditText 
            android:layout_width="match_parent" 
            android:id="@+id/ADConfigKeyword" 
            android:layout_weight="0.05" 
            android:layout_height="25dp"
            android:layout_marginBottom="20dp"&gt;
            &lt;requestFocus&gt;&lt;/requestFocus&gt;
        &lt;/EditText&gt;

            &lt;TextView
            style="@style/SmallFont"
            android:text="@string/adcache"
            android:layout_weight="0.03"
             /&gt;
        &lt;RadioGroup 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:orientation="horizontal"
            android:checkedButton="@+id/adcache" 
            android:id="@+id/adcachegroup"
            android:gravity="center" &gt;

            &lt;RadioButton 
                android:text="Yes" 
                android:id="@+id/adcache_true" 
                android:layout_width="80dip" 
                android:layout_height="wrap_content"
&gt;
            &lt;/RadioButton&gt;

            &lt;RadioButton 
                android:text="No" 
                android:id="@+id/adcache_false" 
                android:layout_width="80dip" 
                android:layout_height="wrap_content"&gt;
            &lt;/RadioButton&gt;
        &lt;/RadioGroup&gt; 

        &lt;TableLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/ADConfigMainsite"
            android:layout_weight="0.76"
            android:gravity="bottom"&gt;   
                &lt;TableRow 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"        
                    android:id="@+id/ADConfigMainsite"
                    android:onClick="onClickADConfigSave"
                    android:layout_weight="0.05"
                    android:gravity="bottom"&gt;
                        &lt;TextView   
                            android:text="@string/adconfigsave" 
                            style="@style/NormalFont"   
                            android:gravity="bottom"/&gt;
                 &lt;/TableRow&gt;
    &lt;/TableLayout&gt;


&lt;/LinearLayout&gt;
</code></pre>

<p>And Here is the LogCat-Log:</p>

<pre>
    08-31 13:56:42.183: WARN/dalvikvm(2345): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345): FATAL EXCEPTION: main
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345): java.lang.IllegalStateException: Could not find a method onClickADConfigSave(View) in the activity class de.retowaelchli.filterit.ADFilterConfigActivity for onClick handler on view class android.widget.TableRow with id 'ADConfigMainsite'
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.view.View$1.onClick(View.java:2178)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.view.View.performClick(View.java:2532)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.view.View$PerformClick.run(View.java:9277)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.os.Handler.handleCallback(Handler.java:587)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.os.Handler.dispatchMessage(Handler.java:92)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.os.Looper.loop(Looper.java:143)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.app.ActivityThread.main(ActivityThread.java:4196)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at java.lang.reflect.Method.invoke(Method.java:507)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at dalvik.system.NativeStart.main(Native Method)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345): Caused by: java.lang.NoSuchMethodException: onClickADConfigSave
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at java.lang.ClassCache.findMethodByName(ClassCache.java:247)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at java.lang.Class.getMethod(Class.java:962)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     at android.view.View$1.onClick(View.java:2171)
    08-31 13:56:42.183: ERROR/AndroidRuntime(2345):     ... 11 more
    08-31 13:56:42.183: WARN/ActivityManager(1740):   Force finishing activity de.retowaelchli.filterit/.ADFilterConfigActivity
    08-31 13:56:42.693: WARN/ActivityManager(1740): Activity pause timeout for HistoryRecord{409895c0 de.retowaelchli.filterit/.ADFilterConfigActivity}
</pre>

<p>Thanks in Advance for your help.</p>
