0

在我的应用程序中,单击“收藏夹”按钮应该会打开一个新窗口,其中包含一个列表视图,其内容来自数据库。单击此按钮时出现 NullPointerException。

以下是相关代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_favorites_list_view);

    dbHelper = new DatabaseAdapter(this);
    dbHelper.open();        
    displayListView();
}

private void displayListView() {

    c = dbHelper.findFavoritesInTable();
    displayCursor();

}

private void displayCursor() {

    String[] columns = new String[] { DatabaseAdapter.FAV_NAME,
            DatabaseAdapter.FAV_CAT1, DatabaseAdapter.FAV_CAT2,
            DatabaseAdapter.FAV_CAT3, DatabaseAdapter.FAV_CUISINE };
    int[] to = new int[] { R.id.name, R.id.cat1, R.id.cat2, R.id.cat3,
            R.id.cuisine };
    cursorAdapter = new SimpleCursorAdapter(this, R.layout.poi_info, c,
            columns, to, 0);

    ListView listView = (ListView) findViewById(R.id.poilistview);
    // Assign adapter to ListView
    listView.setAdapter(cursorAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        // When we click on elements :
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent i = new Intent(getApplicationContext(),
                    POIActivity.class);

            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String street = ((TextView) view.findViewById(R.id.street))
                    .getText().toString();
            String website = ((TextView) view.findViewById(R.id.website))
                    .getText().toString();
            String telephone = ((TextView) view
                    .findViewById(R.id.telephone)).getText().toString();
            String remarks = ((TextView) view.findViewById(R.id.remarks))
                    .getText().toString();
            String price = ((TextView) view.findViewById(R.id.price))
                    .getText().toString();
            String mobile = ((TextView) view.findViewById(R.id.mobile))
                    .getText().toString();
            String cat1 = ((TextView) view.findViewById(R.id.cat1))
                    .getText().toString();
            String cat2 = ((TextView) view.findViewById(R.id.cat2))
                    .getText().toString();
            String cat3 = ((TextView) view.findViewById(R.id.cat3))
                    .getText().toString();
            String cuisine = ((TextView) view.findViewById(R.id.cuisine))
                    .getText().toString();

            i.putExtra(ID_NAME, name);
            i.putExtra(ID_STREET, street);
            i.putExtra(ID_WEBSITE, website);
            i.putExtra(ID_TELEPHONE, telephone);
            i.putExtra(ID_REMARKS, remarks);
            i.putExtra(ID_PRICE, price);
            i.putExtra(ID_MOBILE, mobile);
            i.putExtra(ID_CAT1, cat1);
            i.putExtra(ID_CAT2, cat2);
            i.putExtra(ID_CAT3, cat3);
            i.putExtra(ID_CUISINE, cuisine);

            startActivity(i);
        }

    }); 
}  

我的 logcat 的这一部分显示了问题的出处:
在此处输入图像描述

当我注释掉这一行时,没有更多的 NPE(但当然没有任何工作):

listView.setAdapter(cursorAdapter);

让我感到困惑的是,在这个应用程序中,我有另一个按钮打开另一个窗口,其中包含一个列表视图,其内容来自数据库的另一个表,并且运行良好。代码非常相似,我只是更改了变量的名称。
那么,为什么我可以在一种情况下很好地打开我的列表视图并单击元素,而在这种情况下,我得到了一个具有类似代码的 NPE?!我不知道它来自哪里,也许是我数据库中的表?感谢您的帮助,我在这里真的很挣扎。
编辑:这是完整的 logcat:

04-12 11:45:03.779: W/dalvikvm(2998): threadid=1: thread exiting with uncaught exception (group=0x40a95390)
04-12 11:45:03.779: E/AndroidRuntime(2998): FATAL EXCEPTION: main
04-12 11:45:03.779: E/AndroidRuntime(2998): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.asiatypeapplicationbeta/com.example.asiatypeapplicationbeta.FavoritesListView}: java.lang.NullPointerException
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.ActivityThread.access$600(ActivityThread.java:126)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at  android.os.Handler.dispatchMessage(Handler.java:99)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.os.Looper.loop(Looper.java:137)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.ActivityThread.main(ActivityThread.java:4482)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at java.lang.reflect.Method.invokeNative(Native Method)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at java.lang.reflect.Method.invoke(Method.java:511)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at dalvik.system.NativeStart.main(Native Method)
04-12 11:45:03.779: E/AndroidRuntime(2998): Caused by: java.lang.NullPointerException
04-12 11:45:03.779: E/AndroidRuntime(2998):     at com.example.asiatypeapplicationbeta.FavoritesListView.displayCursor(FavoritesListView.java:62)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at com.example.asiatypeapplicationbeta.FavoritesListView.displayListView(FavoritesListView.java:46)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at com.example.asiatypeapplicationbeta.FavoritesListView.onCreate(FavoritesListView.java:40)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.Activity.performCreate(Activity.java:4465)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-12 11:45:03.779: E/AndroidRuntime(2998):     at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
04-12 11:45:03.779: E/AndroidRuntime(2998):     ... 11 more  

我的 DatabaseAdapter.class :

public class DatabaseAdapter {

public static final String DATABASE_POITABLE = "tblpoisurvey";
public static final String DATABASE_FAVTABLE = "tblfavorites";

public static final String KEY_ROWID = "_id";
public static final String POI_NAME = "name";
public static final String POI_CAT1 = "cat1";
public static final String POI_CAT2 = "cat2";
public static final String POI_CAT3 = "cat3";
public static final String POI_SUBCAT = "subcat";
public static final String POI_STREET = "street";
public static final String POI_WEBSITE = "website";
public static final String POI_REMARKS = "remarks";
public static final String POI_TELEPHONE = "telephoneNo";
public static final String POI_MOBILE = "mobileNo";
public static final String POI_PRICE = "priceLevel";
public static final String POI_DATEFRIENDLY = "dateFriendly";
public static final String POI_PAYMENT = "paymentOptions";
public static final String POI_CUISINE = "cuisine";
// public static final String COL_X = "x";
// public static final String COL_Y = "y";

public static final String FAV_ID = "_id";
public static final String FAV_NAME = "name";
public static final String FAV_CAT1 = "cat1";
public static final String FAV_CAT2 = "cat2";
public static final String FAV_CAT3 = "cat3";
public static final String FAV_STREET = "street";
public static final String FAV_WEBSITE = "website";
public static final String FAV_REMARKS = "remarks";
public static final String FAV_TELEPHONE = "telephoneNo";
public static final String FAV_MOBILE = "mobileNo";
public static final String FAV_PRICE = "priceLevel";
public static final String FAV_DATEFRIENDLY = "dateFriendly";
public static final String FAV_PAYMENT = "paymentOptions";
public static final String FAV_CUISINE = "cuisine";

private Context myContext;
private static SQLiteDatabase myDatabase;
private DatabaseHelper dbHelper;
private Cursor c;

// Constructor
public DatabaseAdapter(Context context) {
    this.myContext = context;
}

public DatabaseAdapter open() throws SQLException {
    dbHelper = new DatabaseHelper(myContext);
    try {
        dbHelper.createDatabase();
    } catch (IOException e) {
        e.printStackTrace();
    }
    myDatabase = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    if (c != null) {
        c.close();
    }
    try {
        dbHelper.close();
        myDatabase.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

// Method findPoiInTable, called when the user clicks on a level2 icon
// button to open the listview
public Cursor findPoiInTable(String categoryInterval) {
    String where = POI_CAT1 + " IN " + categoryInterval + " OR " + POI_CAT2
            + " IN " + categoryInterval + " OR " + POI_CAT3 + " IN "
            + categoryInterval;

    Cursor c = myDatabase.query(DATABASE_POITABLE, new String[] {
            KEY_ROWID, POI_NAME, POI_STREET, POI_WEBSITE, POI_PAYMENT,
            POI_TELEPHONE, POI_PRICE, POI_REMARKS, POI_DATEFRIENDLY,
            POI_MOBILE, POI_CAT1, POI_CAT2, POI_CAT3, POI_CUISINE }, where,
            null, null, null, POI_NAME);
    return c;
}

public Cursor findFavoritesInTable() {

    Cursor c = myDatabase.rawQuery("select * from tblfavorites",null);
    return c;
}

public static long insertInTable(String ID_NAME, String ID_CAT1,
        String ID_CAT2, String ID_CAT3, String ID_CUISINE) {
    ContentValues data = new ContentValues();
    data.put(FAV_NAME, ID_NAME);
    data.put(FAV_CAT1, ID_CAT1);
    data.put(FAV_CAT2, ID_CAT2);
    data.put(FAV_CAT3, ID_CAT3);
    data.put(FAV_CUISINE, ID_CUISINE);
    if (myDatabase == null) {

    }
    return myDatabase.insert("DATABASE_FAVTABLE", "nullColumnHack", data);
}
4

1 回答 1

1

试试这个方法。

  //check DatabaseAdapter is your database name with single parameter constructor
    DatabaseAdapter DdbHelper = new DatabaseAdapter(this);
     dbHelper.open();  
     Cursor c = dbHelper.findFavoritesInTable();
     if(c.getCount()!=0){
         System.out.println("CURSOR VALUE:"+c.getCount());
         displayCursor();
     }
     c.close();
     dbHelper.close();
    }

您可以先查找光标值是否不为空,然后您的displayCursor()is 调用。

如果您没有得到解决方案,请发表评论。

于 2013-04-12T04:45:04.283 回答