2013-09-27 96 views
0

我得到一個java.lang.NullPointerException錯誤,我不知道爲什麼。我認爲這可能與我的數據庫中沒有數據有關,但我不確定。有沒有人有任何建議如何使我的數據庫接受沒有數據?我已採取代碼&在多個網站/書籍上對此進行了研究,但這是我收到的最接近的錯誤!非常感謝幫助!先謝謝你!無法啓動ComponentInfo java.lang.NullPointerException

的logcat:

09-27 01:17:14.656: E/AndroidRuntime(3331): FATAL EXCEPTION: main 
09-27 01:17:14.656: E/AndroidRuntime(3331): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pocketbotanist/com.pocketbotanist.HomeScreen}: java.lang.NullPointerException 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.access$700(ActivityThread.java:152) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.os.Looper.loop(Looper.java:137) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.main(ActivityThread.java:5328) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at dalvik.system.NativeStart.main(Native Method) 
09-27 01:17:14.656: E/AndroidRuntime(3331): Caused by: java.lang.NullPointerException 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.pocketbotanist.HomeScreen.onCreate(HomeScreen.java:69) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.Activity.performCreate(Activity.java:5250) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  ... 11 more 

代碼:

package com.pocketbotanist; 

import java.io.File; 

import android.app.ListActivity; 
import android.app.LoaderManager; 
import android.content.CursorLoader; 
import android.content.Intent; 
import android.content.Loader; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView.AdapterContextMenuInfo; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 

import com.pocketbotanist.contentprovider.MyEntryContentProvider; 
import com.pocketbotanist.database.EntryTable; 



public class HomeScreen extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static final int DELETE_ID = Menu.FIRST + 1; 
    // private Cursor cursor; 
    private SimpleCursorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home_screen); 
     this.getListView().setDividerHeight(2); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     //Initial folder creation code 
     File appDirectory = new File(Environment.getExternalStorageDirectory().toString()+"/Pocket Botanist/"); 
     if (!appDirectory.exists()){ 
      appDirectory.mkdir(); 
     } 

     //Drop down list code 
     Spinner spinner = (Spinner) findViewById(R.id.action_spinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 


     fillData(); 
     @SuppressWarnings("unused") 
     View view = (View) getListView().getItemAtPosition(0); 
     registerForContextMenu(getListView()); 
     if (adapter.isEmpty()) 
      System.out.println("IT'S EMPTY"); 
     String[] projection = { EntryTable.COLUMN_CUSTOMID }; 
     long info = adapter.getItemId(0); 
     Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" 
       + info); 
     Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
     cursor.moveToFirst(); 
     System.out.println((cursor.getString(cursor 
        .getColumnIndexOrThrow(EntryTable.COLUMN_CUSTOMID)))); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 


    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case DELETE_ID: 
      String[] projection = { EntryTable.COLUMN_PHOTOS }; 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item 
      .getMenuInfo(); 
      Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" 
        + info.id); 
      Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
      cursor.moveToFirst(); 
      File temp = new File(cursor.getString(cursor 
        .getColumnIndexOrThrow(EntryTable.COLUMN_PHOTOS))); 
      if(temp.exists()){ 
       File[] files = temp.listFiles(); 
       for(int i = 0; i < files.length; i++){ 
        files[i].delete(); 
       } 
       temp.delete(); 
      } 
      getContentResolver().delete(uri, null, null); 
      fillData(); 
      return true; 
     } 

     return super.onContextItemSelected(item); 

    } 


    @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_home_screen, menu); 
     //SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
     case R.id.menu_settings: 
      settCall(); 
      return true; 
     case R.id.menu_map: 
      map1_3(); 
      return true; 
     case R.id.menu_edit: 
      entryScreen("New Entry"); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    public void entryScreen(String t){ 
     Intent intent = new Intent(this, EntryScreen.class); 
     intent.putExtra("passer", t); 
     startActivity(intent); 
    } 

    public void settCall(){ 
     Intent sett = new Intent(this,SettingsActivity.class); 
     startActivity(sett); 
    } 

    public void map1_3(){ 

     Intent map13 = new Intent(this,Entrymap_1_3.class); 
     startActivity(map13); 
    } 


    // Opens the second activity if an entry is clicked 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Intent i = new Intent(this, EntryScreen.class); 
     Uri itemUri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" + id); 
     i.putExtra(MyEntryContentProvider.CONTENT_ITEM_TYPE, itemUri); 

     startActivity(i); 
    } 

    //@Override 
    //When we create the loader we're going to get the projection for the ID, customID, species name, and time columns 
    //(insures that these exist within the database) 
    //then we create our cursor loader which will be responsible for loading data from the database 
    //using the projection and our content provider 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
     String[] projection = { EntryTable.COLUMN_ID, EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES, EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTOS, EntryTable.COLUMN_PHOTO }; 
     CursorLoader cursorLoader = new CursorLoader(this, 
       MyEntryContentProvider.CONTENT_URI, projection, null, null, null); 
     return cursorLoader; 
    } 

    private void fillData() { 

     // Fields from the database (projection) 
     String[] from = new String[] { EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES , EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTO}; 
     // Fields on the UI to which we map 
     int[] to = new int[] { R.id.customidlabel, R.id.namelabel, R.id.timelabel, R.id.imageView }; 

     getLoaderManager().initLoader(1, null, this);  //changed to 1 
     adapter = new SimpleCursorAdapter(this, R.layout.list_row, null, from, to, 0); 

     setListAdapter(adapter); 
    } 

    @Override 
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
     } 


    @Override 
    public void onLoadFinished(Loader<Cursor> arg0, Cursor data) { 
     adapter.swapCursor(data);  
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     adapter.swapCursor(null); 
    } 

} 

回答

1

這是返回null的查詢方法,你的光標爲空:

Cursor cursor = getContentResolver().query(uri, projection, null, null, null);// check why your query is returning null 
     cursor.moveToFirst(); // cursor is null 
+0

有沒有辦法讓遊標爲空/不返回任何東西? – adamtw1

+0

做一個if語句,if(cursor!= null){cursor.moveToFirst(); System.out.println(...)} – Turkish

0

69行,有一個與問題你光標。確保存在數值。

+0

我沒有任何價值。有沒有辦法讓光標不接受任何值? – adamtw1

+0

@ adamtw1它的意思是,遊標爲空,並且您正在遍歷它以獲取所需的值。這實際上不存在。設想一個動態數組的情況,並用查詢填充你的數組,並且它獲得四條記錄(因此變成size = 4)。但是當你嘗試訪問數組[5]時,它會給你帶來outofbound的異常。 – Zeeshan

相關問題