Search code examples
javaandroidsqliteforceclose

Attempting to Save Data In a SQLite Database - Cleaned (no major issues) Still Force Closes


I'm a bit new to StackOverflow and I was wondering if I could have a bit of input on the following issue: I'm attempting to save a bit of data in a sqlite database but each time I attempt to do so the app force closes and I'm not sure why. I've cleaned the file and there are no issues. (I have no idea what I've done wrong - but something has been programmed incorrectly.)

JAVA:

import android.app.Activity;
import android.app.AlertDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TimePicker;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.text.format.DateFormat;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.format.DateFormat;
import android.widget.TimePicker;

import com.nfc.linkingmanager.TimePickerFragment.TimePickedListener;

import java.util.Calendar;

public class AddEditCountry extends Activity implements TimePickedListener 
{
    private TextView mPickedTimeText;
    private Button mPickTimeButton;
    private long rowID; 
     private EditText nameEt;
     private EditText capEt;
     private EditText codeEt;
     private TimePicker timeEt;
     public static final String KEY_BUNDLE_TIME = "time";
     public static final String KEY_BUNDLE_MIN = "min";

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
          setContentView(R.layout.add_country);  // where your_layout is the name of the xml file with the layout you want to use minus the .xml extention
         //this layout must contain all of these views below that you are trying to initialize

          nameEt = (EditText) findViewById(R.id.nameEdit);
          capEt = (EditText) findViewById(R.id.capEdit);
          codeEt = (EditText) findViewById(R.id.codeEdit);
          timeEt = (TimePicker) findViewById(R.id.timeEdit);

          Bundle extras = getIntent().getExtras(); 

          if (extras != null)
          {
              rowID = extras.getLong("row_id");
             nameEt.setText(extras.getString("name"));  
             capEt.setText(extras.getString("cap"));  
             codeEt.setText(extras.getString("code"));    
             String time = extras.getString("time");
             String[] parts = time.split(":");
             timeEt.setCurrentHour(Integer.valueOf(parts[0]));
             timeEt.setCurrentMinute(Integer.valueOf(parts[1]));
             timeEt.setIs24HourView(false);
          }

          Button saveButton =(Button) findViewById(R.id.saveBtn);
          saveButton.setOnClickListener(new OnClickListener() {

              public void onClick(View v) 
              {
                 if (nameEt.getText().length() != 0)
                 {
                    AsyncTask<Object, Object, Object> saveContactTask = 
                       new AsyncTask<Object, Object, Object>() 
                       {
                          @Override
                          protected Object doInBackground(Object... params) 
                          {
                             saveContact();
                             return null;
                          }

                          @Override
                          protected void onPostExecute(Object result) 
                          {
                             finish();
                          }
                       }; 

                    saveContactTask.execute((Object[]) null); 
                 }

                 else
                 {
                    AlertDialog.Builder alert = new AlertDialog.Builder(AddEditCountry.this);
                    alert.setTitle(R.string.errorTitle); 
                    alert.setMessage(R.string.errorMessage);
                    alert.setPositiveButton(R.string.errorButton, null); 
                    alert.show();
                 }
              } 
         });
       }


           private void saveContact() 
           {
              DatabaseConnector dbConnector = new DatabaseConnector(this);

              if (getIntent().getExtras() == null)
              {
                  dbConnector.insertContact(nameEt.getText().toString(),
                          capEt.getText().toString(),
                          timeEt.getCurrentHour().toString() + ":"
                              + timeEt.getCurrentMinute().toString(),
                          codeEt.getText().toString());

              }
              else
              {
                  dbConnector.insertContact(nameEt.getText().toString(),
                          capEt.getText().toString(),
                          timeEt.getCurrentHour().toString() + ":"
                              + timeEt.getCurrentMinute().toString(),
                          codeEt.getText().toString());
              }
           }


        @Override
        public void onTimePicked(Calendar time)
        {
            // display the selected time in the TextView
            mPickedTimeText.setText(DateFormat.format("h:mm a", time));
        }
}

XML:

   <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="wrap_content" android:layout_weight="1">

   <LinearLayout android:id="@+id/linearLayout"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical" 
      android:padding="5dp">

      <EditText android:id="@+id/nameEdit"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" 
         android:imeOptions="actionNext" 
         android:hint="@string/name_hint"
         android:inputType="textPersonName|textCapWords"/>

      <EditText android:id="@+id/capEdit"
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:imeOptions="actionNext" 
         android:hint="@string/cap_hint"
         android:inputType="textPersonName|textCapWords"/>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Data Limit"
        android:textColor="#ffffff"
        android:textAppearance="?android:textAppearanceMedium" />

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="left"
            android:textColor="#ffffff"
            android:text="10MB" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="right"
            android:textColor="#ffffff"
            android:text="Unlimited Data" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Bandwidth Limit"
        android:textColor="#ffffff"
        android:textAppearance="?android:textAppearanceMedium" />

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:gravity="left"
            android:textColor="#ffffff"
            android:text="10kbs" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:textColor="#ffffff"
            android:gravity="right"
            android:text="Unlimited Bandwidth" />
    </LinearLayout>

    <TextView
        android:id="@+id/TextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:textAppearanceSmall" />

    <TextView
        android:id="@+id/TextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="WiFi Time Limit"
        android:textColor="#ffffff"
        android:textAppearance="?android:textAppearanceMedium" />

    <TimePicker
        android:id="@+id/timeEdit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_weight="1.0" />

    <EditText
        android:id="@+id/codeEdit"
        android:inputType="textUri"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:lines="1"
        android:hint="@string/code_hint"
        android:imeOptions="actionNext" />




      <Button android:id="@+id/saveBtn" 
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="15dp"
         android:layout_gravity="center_horizontal"
         android:text="@string/save_btn"/>
   </LinearLayout>
</ScrollView>

PROBLEMS:

Cleaned - No Problems

LOGCAT:



03-29 13:23:28.950: D/OpenGLRenderer(20744): Enabling debug mode 0
    03-29 13:23:33.780: D/AndroidRuntime(20744): Shutting down VM
    03-29 13:23:33.780: W/dalvikvm(20744): threadid=1: thread exiting with uncaught exception (group=0x41f7b930)
    03-29 13:23:33.790: E/AndroidRuntime(20744): FATAL EXCEPTION: main
    03-29 13:23:33.790: E/AndroidRuntime(20744): android.app.SuperNotCalledException: Activity {com.app.gamedemo/com.app.gamedemo.AddEditCountry} did not call through to super.onCreate()
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2146)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.os.Handler.dispatchMessage(Handler.java:99)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.os.Looper.loop(Looper.java:137)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at android.app.ActivityThread.main(ActivityThread.java:5041)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at java.lang.reflect.Method.invokeNative(Native Method)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at java.lang.reflect.Method.invoke(Method.java:511)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    03-29 13:23:33.790: E/AndroidRuntime(20744):    at dalvik.system.NativeStart.main(Native Method)
    03-29 13:23:35.390: I/Process(20744): Sending signal. PID: 20744 SIG: 9

Solution

  • The problem is here in your onCreate()

     @Override
        public void onCreate(Bundle savedInstanceState)
        {
    
    
    
    
              nameEt = (EditText) findViewById(R.id.nameEdit);
              capEt = (EditText) findViewById(R.id.capEdit);
              codeEt = (EditText) findViewById(R.id.codeEdit);
              timeEt = (TimePicker) findViewById(R.id.timeEdit);
    

    You need to call setContentView() before trying to access your EditTexts and so on. Your Views "live" within your layout (xml file) so they are null until you inflate the layout. Change it to someting like

     @Override
        public void onCreate(Bundle savedInstanceState)
        {
              setContentView(R.layout.your_layout);  // where your_layout is the name of the xml file with the layout you want to use minus the .xml extention
             //this layout must contain all of these views below that you are trying to initialize
    
              nameEt = (EditText) findViewById(R.id.nameEdit);
              capEt = (EditText) findViewById(R.id.capEdit);
              codeEt = (EditText) findViewById(R.id.codeEdit);
              timeEt = (TimePicker) findViewById(R.id.timeEdit);
    

    Edit

    Just like the error says, you are trying to cast a TextView to a TimePicker. Here

    timeEt = (TimePicker) findViewById(R.id.timeEdit);

    (R.id.timeEdit) points to a TextView but here

    private TimePicker timeEt;

    you declare it as a TimePicker. If you want it to be a TimePicker then change it in your xml

    `<TimePicker 
        android:id="@+id/timeEdit"      
        style="@style/StyleText"/> `
    

    Also, you have multiple ids in your xml

    android:id="@+id/codeText"

    might want to change that

    Second Edit

    03-29 13:23:33.790: E/AndroidRuntime(20744): android.app.SuperNotCalledException: Activity {com.app.gamedemo/com.app.gamedemo.AddEditCountry} did not call through to super.onCreate()

    This line in the logcat says it all. You didn't call super.onCreate(). Add the following line as the first line in your onCreate() method

    super.onCreate(savedInstanceState);
    

    When reading your logcat, look for where it says Fatal Exception. The next line should say what it is (Null Pointer Exception, Class Cast Exception, etc...) then look for the first line that references your package name and it will tell you where to start looking for the error. Ex. Main.java 57 tells you that whatever the fatal exception was occurs in your Main.java file at line 57. The problem may originally come from somewhere else but this is always a good place to start so you can narrow it down and post relevant code if you need help.