在Android中尝试获取数据库内容时,我得到java.lang.NullPointerException

在Android中尝试获取数据库内容时,我得到java.lang.NullPointerException,android,Android,我使用NewCard.xml中的8个编辑文本框,从中获取值,当按下保存按钮时,我将值存储到数据库中,在相同的保存过程中,我尝试获取值并将它们显示在main.xml文件上的8个不同的TextView框中,当我按下按钮时,我从emulator获得一个FC,结果错误是java.lang.NullPointerException。 如果有人能帮我,那就太好了,因为我从来没有使用过数据库,这是我第一个安卓应用程序,这是唯一能让我完成整个过程并像免费应用程序一样在市场上发布的东西。 下面是NewCard.j

我使用NewCard.xml中的8个编辑文本框,从中获取值,当按下保存按钮时,我将值存储到数据库中,在相同的保存过程中,我尝试获取值并将它们显示在main.xml文件上的8个不同的TextView框中,当我按下按钮时,我从emulator获得一个FC,结果错误是java.lang.NullPointerException。 如果有人能帮我,那就太好了,因为我从来没有使用过数据库,这是我第一个安卓应用程序,这是唯一能让我完成整个过程并像免费应用程序一样在市场上发布的东西。 下面是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)

您是否已确保id db字段是自动递增的。也可以尝试使用cursor.moveToFirst()而不是moveToNext()

您的
NullPointerException
表示您没有名为
@+id/id的
文本视图,可能是因为这不是一个很好的使用值。将其更改为其他名称,看看是否有帮助。

是否已验证getCard()中返回的光标不为null?此查询可能返回null

此外,我不会在showCard()方法中硬编码列索引。相反,请使用:

firstName = cursor.getString(cursor.getColumnIndex(FIRST_NAME);

请为NullPointerException添加可以从“adb logcat”中获得的堆栈跟踪,您可以发布错误堆栈吗?是的,id db字段是自动递增的,对于游标。moveToFirst()我现在就试试。当我放置cursor.moveToFirst()时,模拟器冻结。Hmmm。值得包装您的游标。移动到if(cursor.getCount()>0){//your code here}else{Log.d('NewCard','0 rows found');}好的,我从仿真器中提取了我的数据库,它将所有的行和ll数据放入其中,并且都正确无误。因此,我可以很好地存储数据,没有错误,但在尝试从数据库获取数据时会出现错误。大多数变量都是字符串,对于Long,请使用Long.toString()。您还可以使用Log.d打印出id,并查看它在LogCat中提供了什么。我已经更改了它,但它没有帮助,因为它显示了相同的错误。可能是我用错了吗?我的意思是我的功能在NewCard上,我试图在我的案例BusinessCard.javaNo中的主屏幕上显示它,这是行不通的<代码>新卡
是一项
活动
findViewById()
将允许您更新
NewCard
上的小部件,而不是任何其他活动<代码>新卡
无法修改任何其他
活动
。那么有什么方法可以从主卡执行此操作?我可以使用新卡来存储数据,因为它可以工作,当我按下保存按钮时,我需要它们以某种方式显示在主屏幕上。所以我想总有一种方法可以做到这一点。我还没有验证过,我会这么做的。感谢您提供showCard()方法的提示。我正在验证光标是否为null。从日志的第181行可以粘贴异常,具体是哪一行引发的异常?这一行是:ids.setText(String.valueOf(id));在上面附加的文件中,更改为:ids.setText(Long.toString(id));好的,将textview的id更改为除id以外的其他id。“id”在某种程度上是版面的关键字,将其更改为cardid(或其他),然后在代码中更改它,然后重试。