Исключение нулевого указателя при заполнении Spinner из SQLite. [Java Android] - PullRequest
0 голосов
/ 16 ноября 2011

Моя цель - создать приложение под названием «Список покупок». У меня есть 3 вкладки, первая из которых называется «Просмотреть список», вторая: «Добавить рынок» и последняя: «Добавить продукт». У меня есть 2 счетчика на первой и последней вкладке, заполняемой из таблицы SQLite с именем «DATABASE_MARKETTABLE». На странице «Добавить рынок» я добавляю рынки в DATABASE_MARKETTABLE.

Моя проблема в том, что счетчик из последней вкладки «Добавить продукт» работает просто отлично, он получает все данные из DATABASE_MARKETTABLE (все рынки добавлены), но счетчик из «Просмотреть список» (первая вкладка) выдает мне исключение NULL POINTER. .

Вот мой код:

DatabaseHelper.class:

public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE " + DATABASE_PRODTABLE + " (" +
            KEY_PRODROWID + " INTEGER PRIMARY KEY, " +
            KEY_PRODNAME + " TEXT NOT NULL, " + 
            KEY_PRODAMOUNT + " TEXT NO NULL, " +
            KEY_AMOUNTTYPE + " TEXT NOT NULL, " +
            KEY_MARKETID + " LONG);"
            );
    db.execSQL("CREATE TABLE " + DATABASE_MARKETTABLE + " (" +
            KEY_MARKETROWID + " INTEGER PRIMARY KEY, " +
            KEY_MARKETNAME + " TEXT NOT NULL);"
            );

    }.....

             ArrayList<String> getMarkets(){
    String[] columns = new String[]{KEY_MARKETROWID, KEY_MARKETNAME};
    ArrayList<String> Markets = new ArrayList<String>();
    Cursor c= myDatabase.query(DATABASE_MARKETTABLE, columns, null, null, null, null, null);
    if(c.isLast()) {c.moveToFirst();}
    int iName = c.getColumnIndex(KEY_MARKETNAME);
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        Markets.add(c.getString(iName));

    }
    return Markets;
}

А в AddProductActiviy.class (вкладка «Добавить продукт»):

public void onStart()
{
    DatabaseHelper info=new DatabaseHelper(this);
    super.onStart();
    try {
        info.open();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ArrayList<String> Markets=info.getMarkets();
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, Markets);
    spinDept.setAdapter(spinnerArrayAdapter);
    info.close();


}

И в ViewlistActivity.class (вкладка Viewlist), если я использую тот же код, он получает NULL POINTER EXCEPTION.

Честно говоря, я понятия не имею, почему не работает, и я попробовал потерянные решения, но ничего не работает.

Моя цель состоит в том, чтобы пользователь этого блесна показывал только продукты, связанные с рынком, выбранным из блесна.

EDIT:

ЗДЕСЬ МОИ ОШИБКИ:

11-16 00:20:27.594: E/AndroidRuntime(338): FATAL EXCEPTION: main
11-16 00:20:27.594: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.AndroidProjectActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.ViewlistActivity}: java.lang.NullPointerException
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.os.Looper.loop(Looper.java:123)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-16 00:20:27.594: E/AndroidRuntime(338):  at java.lang.reflect.Method.invokeNative(Native Method)
11-16 00:20:27.594: E/AndroidRuntime(338):  at java.lang.reflect.Method.invoke(Method.java:507)
11-16 00:20:27.594: E/AndroidRuntime(338):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-16 00:20:27.594: E/AndroidRuntime(338):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-16 00:20:27.594: E/AndroidRuntime(338):  at dalvik.system.NativeStart.main(Native Method)
11-16 00:20:27.594: E/AndroidRuntime(338): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.ViewlistActivity}: java.lang.NullPointerException
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.widget.TabHost.setCurrentTab(TabHost.java:326)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.widget.TabHost.addTab(TabHost.java:216)
11-16 00:20:27.594: E/AndroidRuntime(338):  at androidpack.namespace.AndroidProjectActivity.onCreate(AndroidProjectActivity.java:30)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)


11-16 00:20:27.594: E/AndroidRuntime(338): Caused by: java.lang.NullPointerException
11-16 00:20:27.594: E/AndroidRuntime(338):  at androidpack.namespace.ViewlistActivity.onCreate(ViewlistActivity.java:51)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-16 00:20:27.594: E/AndroidRuntime(338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

Кажется, что в ViewlistActivity.class spinDept.setAdapter (spinnerArrayAdapter); это проблема, но я не знаю почему.

EDIT. ЗДЕСЬ МОЯ ПРОСМОТР СПИСКА. КЛАСС

public class ViewlistActivity extends Activity {
Spinner spinDept;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.spinDept=(Spinner)findViewById(R.id.spinnerprost);


    // setare continut din layout
    setContentView(R.layout.viewlist);
    TextView tv=(TextView)findViewById(R.id.tvSQLinfo);

    //Afisare produse din baza de date
    DatabaseHelper info= new DatabaseHelper(ViewlistActivity.this);
    try {
        info.open();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  String data = info.getData();
    info.close();
    tv.setText(data);

    //----------------------------------------------
    try {
        info.open();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ArrayList<String> Markets=info.getMarkets();
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, R.layout.spinner, Markets);
    spinDept.setAdapter(spinnerArrayAdapter);
    info.close();

}

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Вы сказали:

Похоже, что в ViewlistActivity.class spinDept.setAdapter (spinnerArrayAdapter); это проблема, но я не знаю почему.

Исключение с нулевым указателем может означать только одно: что-то равно нулю.

Либо spinDept не создается, либо spinnerArrayAdapter не создается. Я предполагаю, что spinDept равен NULL, потому что я думаю, что setAdapter (null) является допустимым вызовом (для очистки адаптера).

РЕДАКТИРОВАТЬ: Если вы отлаживаете весь путь до тех пор, пока не пропустите эту строку кода, наведите курсор на переменные или добавите часы, один из них будет нулевым.

1 голос
/ 16 ноября 2011

Скорее всего, это не связано напрямую с проблемой. Тем не менее:

KEY_MARKETID + " LONG);"

SQLite не поддерживает тип данных LONG. Интересно, как это может работать вообще. Возможно изменить на INTEGER.

...