Я получаю java.lang.NullPointerException при попытке получить содержимое базы данных в Android - PullRequest
0 голосов
/ 08 июня 2010

Я использую 8 полей EditText из NewCard.xml, из которых я беру значения, и когда нажимается кнопка сохранения, я сохраняю значения в базе данных, в этом же процессе сохранения я пытаюсь получить значения и представить их в 8 различных текстовых полях в файле main.xml, и когда я нажимаю кнопку, я получаю FC из эмулятора, и в результате возникает ошибка java.lang.NullPointerException. Если бы кто-нибудь мог мне помочь, это было бы здорово, поскольку я никогда не использовал базы данных, и это мое первое приложение для Android, и это единственное, что помогает мне завершить все это и опубликовать его на рынке, как бесплатное приложение. Вот полный код из NewCard.java.

public class NewCard extends Activity 
{
    private static String[] FROM = { _ID, FIRST_NAME, LAST_NAME, POSITION, POSTAL_ADDRESS, PHONE_NUMBER, FAX_NUMBER, MAIL_ADDRESS, WEB_ADDRESS};
    private static String ORDER_BY = FIRST_NAME;

    private CardsData cards;

    EditText First_Name;
    EditText Last_Name;
    EditText Position;
    EditText Postal_Address;
    EditText Phone_Number;
    EditText Fax_Number;
    EditText Mail_Address;
    EditText Web_Address;
    Button New_Cancel;
    Button New_Save;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newcard);

        cards = new CardsData(this);

        //Define the Cancel Button in NewCard Activity
        New_Cancel = (Button) this.findViewById(R.id.new_cancel_button);
            //Define the Cancel Button Activity/s
            New_Cancel.setOnClickListener
            (
                new OnClickListener()
                {
                    public void onClick(View arg0)
                    {
                        NewCancelDialog();
                    }
                }
            );//End of the Cancel Button Activity/s

        //Define the Save Button in NewCard Activity
        New_Save = (Button) this.findViewById(R.id.new_save_button);
        //Define the EditText Fields to Get Their Values Into the Database
        First_Name = (EditText) this.findViewById(R.id.new_first_name);
        Last_Name = (EditText) this.findViewById(R.id.new_last_name);
        Position = (EditText) this.findViewById(R.id.new_position);
        Postal_Address = (EditText) this.findViewById(R.id.new_postal_address);
        Phone_Number = (EditText) this.findViewById(R.id.new_phone_number);
        Fax_Number = (EditText) this.findViewById(R.id.new_fax_number);
        Mail_Address = (EditText) this.findViewById(R.id.new_mail_address);
        Web_Address = (EditText) this.findViewById(R.id.new_web_address);

            //Define the Save Button Activity/s
            New_Save.setOnClickListener
            (
                new OnClickListener()
                {
                    public void onClick(View arg0)
                    {
                        //Add Code For Saving The Attributes Into The Database
                        try
                        {
                            addCard(First_Name.getText().toString(), Last_Name.getText().toString(),
                                    Position.getText().toString(), Postal_Address.getText().toString(),
                                    Integer.parseInt(Phone_Number.getText().toString()), 
                                    Integer.parseInt(Fax_Number.getText().toString()),
                                    Mail_Address.getText().toString(), Web_Address.getText().toString());
                            Cursor cursor = getCard();
                            showCard(cursor);
                        }
                        finally
                        {
                            cards.close();
                            NewCard.this.finish();
                        }
                    }
                }
            );//End of the Save Button Activity/s
    }

    //======================================================================================//
    //DATABASE FUNCTIONS
    private void addCard(String firstname, String lastname, String position, String postaladdress,
                        int phonenumber, int faxnumber, String mailaddress, String webaddress)
    {
          // Insert a new record into the Events data source.
          // You would do something similar for delete and update.
        SQLiteDatabase db = cards.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(FIRST_NAME, firstname);
        values.put(LAST_NAME, lastname);
        values.put(POSITION, position);
        values.put(POSTAL_ADDRESS, postaladdress);
        values.put(PHONE_NUMBER, phonenumber);
        values.put(FAX_NUMBER, phonenumber);
        values.put(MAIL_ADDRESS, mailaddress);
        values.put(WEB_ADDRESS, webaddress);
        db.insertOrThrow(TABLE_NAME, null, values); 
    }

    private Cursor getCard()
    {
        // Perform a managed query. The Activity will handle closing
        // and re-querying the cursor when needed.
        SQLiteDatabase db = cards.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, ORDER_BY);
        startManagingCursor(cursor);
        return cursor;
    }

    private void showCard(Cursor cursor)
    {
        // Stuff them all into a big string
        long id = 0;
        String firstname = null;
        String lastname = null;
        String position = null; 
        String postaladdress = null;
        long phonenumber = 0;
        long faxnumber = 0; 
        String mailaddress = null;
        String webaddress = null;

        while (cursor.moveToNext())
        {
            // Could use getColumnIndexOrThrow() to get indexes
            id = cursor.getLong(0); 
            firstname = cursor.getString(1);
            lastname = cursor.getString(2);
            position = cursor.getString(3); 
            postaladdress = cursor.getString(4);
            phonenumber = cursor.getLong(5);
            faxnumber = cursor.getLong(6); 
            mailaddress = cursor.getString(7);
            webaddress = cursor.getString(8);
        }
        // Display on the screen add for each textView
        TextView ids = (TextView) findViewById(R.id.id); 
        TextView fn = (TextView) findViewById(R.id.firstname); 
        TextView ln = (TextView) findViewById(R.id.lastname); 
        TextView pos = (TextView) findViewById(R.id.position); 
        TextView pa = (TextView) findViewById(R.id.postaladdress); 
        TextView pn = (TextView) findViewById(R.id.phonenumber); 
        TextView fxn = (TextView) findViewById(R.id.faxnumber); 
        TextView ma = (TextView) findViewById(R.id.mailaddress); 
        TextView wa = (TextView) findViewById(R.id.webaddress); 

        ids.setText(String.valueOf(id)); //this is the line reported when i get the error
        fn.setText(String.valueOf(firstname));
        ln.setText(String.valueOf(lastname));
        pos.setText(String.valueOf(position)); 
        pa.setText(String.valueOf(postaladdress));
        pn.setText(String.valueOf(phonenumber));
        fxn.setText(String.valueOf(faxnumber)); 
        ma.setText(String.valueOf(mailaddress));
        wa.setText(String.valueOf(webaddress));
    }

    //======================================================================================//
    //Define the Dialog that alerts you when you press the Cancel button
    private void NewCancelDialog() 
    {
        new AlertDialog.Builder(this)
            .setMessage("Are you sure you want to cancel?")
            .setTitle("Cancel")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog, int id) 
                        {
                            NewCard.this.finish();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog, int id)
                        {
                            dialog.cancel();
                        }
                    })
                    .show();
    }//End of the Cancel Dialog

}

Вот стек ошибок:

06-07 19:05:21.728: ERROR/AndroidRuntime(207): Uncaught handler: thread main exiting due to uncaught exception
06-07 19:05:21.788: ERROR/AndroidRuntime(207): java.lang.NullPointerException
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.test.android.bussinesscard.NewCard.showCard(NewCard.java:181)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.test.android.bussinesscard.NewCard.access$1(NewCard.java:143)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.test.android.bussinesscard.NewCard$2.onClick(NewCard.java:104)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.View.performClick(View.java:2364)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.View.onTouchEvent(View.java:4179)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.View.dispatchTouchEvent(View.java:3709)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.os.Looper.loop(Looper.java:123)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.main(ActivityThread.java:4363)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at java.lang.reflect.Method.invokeNative(Native Method)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at java.lang.reflect.Method.invoke(Method.java:521)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-07 19:05:21.788: ERROR/AndroidRuntime(207):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 3 ]

1 голос
/ 08 июня 2010

Вы убедились, что курсор, возвращаемый в getCard (), не равен нулю?Этот запрос может возвращать нуль ..

Кроме того, я бы не стал жестко кодировать индексы столбцов в методе showCard ().Вместо этого используйте:

firstName = cursor.getString(cursor.getColumnIndex(FIRST_NAME);
0 голосов
/ 08 июня 2010

Ваш NullPointerException означает, что у вас нет TextView с именем @+id/id, возможно, потому что это не очень хорошее значение для использования. Измените его на другое имя и посмотрите, поможет ли это.

0 голосов
/ 08 июня 2010

Вы удостоверились, что ваше поле id db имеет автоинкремент. Также, возможно, попробуйте использовать cursor.moveToFirst () вместо moveToNext ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...