2013-02-13 114 views
0

每當我使用Cursor對象從數據庫檢索數據時,我的應用程序每次崩潰。 我必須採取什麼預防措施?請幫忙光標錯誤android

在這個例子中,我有一個簡單的表單和一個提交按鈕。提交後,列車名稱將顯示在微調框中。

錯誤

02-14 00:38:48.428: E/AndroidRuntime(456): FATAL EXCEPTION: main 
02-14 00:38:48.428: E/AndroidRuntime(456): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.spinnerexample/com.example.spinnerexample.MainActivity}: java.lang.NullPointerException02-14 00:38:48.428: E/AndroidRuntime(456):  atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.os.Looper.loop(Looper.java:123) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-14 00:38:48.428: E/AndroidRuntime(456): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 00:38:48.428: E/AndroidRuntime(456): at java.lang.reflect.Method.invoke(Method.java:507) 
02-14 00:38:48.428: E/AndroidRuntime(456): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-14 00:38:48.428: E/AndroidRuntime(456): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-14 00:38:48.428: E/AndroidRuntime(456): at dalvik.system.NativeStart.main(Native Method) 
02-14 00:38:48.428: E/AndroidRuntime(456): Caused by: java.lang.NullPointerException 
02-14 00:38:48.428: E/AndroidRuntime(456): at com.example.spinnerexample.MainActivity.onCreate(MainActivity.java:42) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-14 00:38:48.428: E/AndroidRuntime(456): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
02-14 00:38:48.428: E/AndroidRuntime(456): ... 11 more 

我的光標對象的Java文件

public class AddTrains { 

    private static final int DB_VERSION = 1; 
    private static final String DB_NAME = "mydb"; 
    private static final String TABLE_NAME = "trains"; 
    private static final String KEY_ID = "_id"; 
    private static final String KEY_TRAIN_NAME = "train_name"; 
    private static final String KEY_TRAIN_NUMBER = "train_number"; 
    private static final String KEY_HALT1 = "halt1"; 
    private static final String KEY_HALT2 = "halt2"; 
    private static final String KEY_HALT3 = "halt3"; 
    private static final String KEY_HALT4 = "halt4"; 
    private static final String KEY_HALT5 = "halt5"; 

    private DBHelper ourHelper; 
    private final Context context; 
    private SQLiteDatabase ourDatabase; 

    private static final class DBHelper extends SQLiteOpenHelper { 

    public DBHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
       KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_TRAIN_NAME + " TEXT NOT NULL, " + 
       KEY_TRAIN_NUMBER + " TEXT NOT NULL, " + 
       KEY_HALT1 + " TEXT NOT NULL, " + 
       KEY_HALT2 + " TEXT NOT NULL, " + 
       KEY_HALT3 + " TEXT NOT NULL, " + 
       KEY_HALT4 + " TEXT NOT NULL, " + 
       KEY_HALT5 + " TEXT NOT NULL); " 
       ); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 
    } 

    public AddTrains(Context c){ 
     context = c; 
    } 

    public AddTrains open() throws SQLException{ 

     ourHelper = new DBHelper(context); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close(){ 

     ourHelper.close(); 
    } 

    public long createEntry(String tname, int tnumber, String stop1, 
      String stop2, String stop3, String stop4, String stop5) { 
     // TODO Auto-generated method stub 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_TRAIN_NAME, tname); 
     cv.put(KEY_TRAIN_NUMBER, tnumber); 
     cv.put(KEY_HALT1, stop1); 
     cv.put(KEY_HALT2, stop2); 
     cv.put(KEY_HALT3, stop3); 
     cv.put(KEY_HALT4, stop4); 
     cv.put(KEY_HALT5, stop5); 
     return ourDatabase.insert(TABLE_NAME, null, cv); 
    } 

    public Set<String> getAllData() { 
     // TODO Auto-generated method stub 
     Set<String> set = new HashSet<String>(); 
     String selectQuery = "select * from " + TABLE_NAME; 
     Cursor cursor = ourDatabase.rawQuery(selectQuery, null); 
     Log.d("Count",cursor.getCount()+""); 
     if(cursor.getCount() > 0){ 
     if (cursor.moveToFirst()) { 
     do { 
     set.add(cursor.getString(1)); 
     } while (cursor.moveToNext()); 
     } 
     } 
     cursor.close(); 
     return set; 
    } 
} 

Mainactivity文件

public class MainActivity extends Activity implements OnClickListener { 

    EditText train_name, train_number, halt1, halt2, halt3, halt4, halt5; 
    Button submit; 
    Spinner spinner; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     train_name = (EditText) findViewById(R.id.train_name); 
     train_number = (EditText) findViewById(R.id.train_no); 
     halt1 = (EditText) findViewById(R.id.halt1); 
     halt2 = (EditText) findViewById(R.id.halt2); 
     halt3 = (EditText) findViewById(R.id.halt3); 
     halt4 = (EditText) findViewById(R.id.halt4); 
     halt5 = (EditText) findViewById(R.id.halt5); 
     spinner = (Spinner) findViewById(R.id.spinner1); 

     submit.setOnClickListener(this); 

     AddTrains db = new AddTrains(this); 
     db.open(); 
     Set<String> set = db.getAllData(); 
      //Convert set into list 
     List<String> list = new ArrayList<String>(set); 
      //Sort Data Alphabetical order 
     Collections.sort(list, new Comparator<String>() { 
     @Override 
     public int compare(String lhs, String rhs) { 
     return lhs.compareTo(rhs); 
     } 
     }); 
     ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this, 
       android.R.layout.simple_spinner_item, list); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 

     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View v, int position,long id) { 
       String name = parent.getItemAtPosition(position).toString(); 
       Toast.makeText(getApplicationContext(), "You Selected: "+ name, Toast.LENGTH_LONG).show(); 
        } 
      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
      } 
       }); 
     db.close(); 
    } 

    public void onClick(View v){ 
     switch(v.getId()){ 

     case R.id.button1: 
      boolean DidItWorked = true; 

      try{ 
       String tname = train_name.getText().toString(); 
       int tnumber = Integer.parseInt(train_number.getText().toString()); 
       String stop1 = halt1.getText().toString(); 
       String stop2 = halt2.getText().toString(); 
       String stop3 = halt3.getText().toString(); 
       String stop4 = halt4.getText().toString(); 
       String stop5 = halt5.getText().toString(); 

       AddTrains at = new AddTrains(this); 
       at.open(); 
       at.createEntry(tname, tnumber, stop1, stop2, stop3, stop4, stop5); 
       at.close(); 
      }catch(SQLiteException e){ 

      } 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

} 
+0

哪裏是在MainActivity PLZ行號42也增加相應的代碼 – 2013-02-13 19:39:10

回答

1

如果你解決了這個,這將是很好後,你想通了什麼別人(像我:)學習的榜樣。

有一件事我總是做任何有一個catch塊放一個Log.d味精。例如,你有

public void onClick(View v){ 
    switch(v.getId()){ 

    case R.id.button1: 
     boolean DidItWorked = true; 

     try{ 
      String tname = train_name.getText().toString(); 
      // snip ... 
      at.createEntry(tname, tnumber, stop1, stop2, stop3, stop4, stop5); 
      at.close(); 
     }catch(SQLiteException e){ 

     } 

那麼,如果炸彈在那裏會發生什麼?你得到一個堆棧跟蹤轉儲 - 並且你的應用程序在用戶上崩潰。我建議這樣的:

 }catch(SQLiteException e){ 
      Log.d ("OMG", "button1::onClick() caught exception: " + e.toString()) ; 
      // do nothing or some clean up ... but app will likely keep chugging along 
     } 
0

你提領一空指針。我們的數據庫爲null,或者rawQuery返回null。檢查第42行,如果它的查詢語句是數據庫是空的,否則它是遊標。如何解決這個問題取決於你在那裏找到什麼。

1

多個問題:

  1. Delcared按鈕,設置一個監聽器,但從來沒有創建或發現XML。

    是否缺少

    submit=(Button)findViewById(R.id.awesome_button); 
    
  2. 你確定這是什麼意思?

    while (cursor.moveToNext()); 
    
  3. 你檢查42號線嗎?詳情請點這條線是

    02-14 00:38:48.428: E/AndroidRuntime(456): Caused by: java.lang.NullPointerException 
    02-14 00:38:48.428: E/AndroidRuntime(456): at com.example.spinnerexample.MainActivity.onCreate(MainActivity.java:42) 
    
+0

我已刪除題號1&3 ..但仍是微調無顯示... – user2054763 2013-02-13 20:06:11

+0

什麼現在是錯誤,它指向哪條線? 「什麼都不顯示」你是否得到了一個懷疑?或只是沒有顯示?你可以在排序後打印出'list',看看你是否收回數據。 – wtsang02 2013-02-13 20:10:57