2013-02-13 3 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 

Мой Cursor Объект 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

где номер строки 42 в MainActivity плз добавить соответствующий код –

ответ

1

Если вы решили эту проблему, было бы хорошо, чтобы после того, что вы выяснили, для других (как я :), чтобы учиться.

Одна вещь, которую я всегда. Например, у вас есть

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, если ее запрос-запрос - это база данных, она равна null, иначе ее указатель. Как это исправить, зависит от того, что вы узнали.

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

+0

Что такое ошибка в настоящее время , и на какой строке это указывает? «Не отображается ничего». Вы получаете Exeception? или просто ничего не отображается? Можете ли вы также распечатать «список» после сортировки, чтобы узнать, вернулись ли вы данные. – wtsang02

Смежные вопросы