【发布时间】:2011-12-29 23:09:19
【问题描述】:
我的目标是制作一个名为“购物清单”的应用程序。我有 3 个选项卡,第一个名为:“查看列表”,第二个是:“添加市场”,最后一个是:“添加产品”。我有 2 个微调器在第一个和最后一个选项卡上,从名为“DATABASE_MARKETTABLE”的 SQLite 表填充。在“添加市场”中,我将市场添加到 DATABASE_MARKETTABLE。
我的问题是最后一个选项卡“添加产品”中的微调器工作得很好,它从 DATABASE_MARKETTABLE 获取所有数据(添加了所有市场),但来自“查看列表”(第一个选项卡)的微调器向我抛出了一个 NULL POINTER EXCEPTION .
这是我的代码:
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。
老实说,我不知道为什么不起作用,我尝试了丢失的解决方案,但没有任何效果。
我的目标是让该微调器仅显示与从微调器中选择的市场相关联的产品。
编辑:
这是我的错误:
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);是问题,但我不知道为什么。
编辑。这是我的 VIEWLISTACTIVITY.CLASS
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();
}
【问题讨论】:
-
您是否设置了一些调试点来查看究竟什么是空?堆栈跟踪还可以准确地告诉您导致 NPE 的代码行。请同时发布。
-
我添加了我的错误。似乎 spinDept.setAdapter(spinnerArrayAdapter);是问题所在,在 ViewlistActivity.class 中(对应于 Viewlist Tab)
-
您能否发布 ViewListActivity.class 中的代码,因为您是说您认为 Null 问题源于此?
-
这很奇怪。现在它不会抛出任何异常,只是不会在 Viewlist Tab spinner 中显示任何内容,并且 Add Product tab spinner 工作得很好。
-
布局文件呢?您在 ViewListActivity 类中使用了不同的布局文件。由于在调用 setAdapter 时设置的代码除了使用的布局外是相同的,所以我会比较两者,看看是否有遗漏或错误。
标签: java android database sqlite spinner