2013-09-03 1 views
0

커서 로더에 문제가있는 개발중인 Android 앱이 있습니다. 아래 코드는 & logcat입니다. 누구든지 고칠 방법에 대한 제안이 있습니까? 응용 프로그램은 데이터베이스를 사용하며 이것은 홈 화면입니다. 응용 프로그램은 또한 사진 &지도를 사용합니다.안드로이드가 커서 로더에 커서를 캐스팅 할 수 없습니다.

코드 :

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(); 
     //View listItem=(View)((Menu) this.getListView()).getItem(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 cursor = new CursorLoader(this, 
       MyEntryContentProvider.CONTENT_URI, projection, null, null, null); 
     if (cursor != null) { 
      ((Cursor) cursor).moveToFirst(); 
     } 

     return cursor; 
    } 

    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); 
    } 

} 

로그 캣 :

09-03 00:59:05.916: W/dalvikvm(13515): threadid=1: thread exiting with uncaught exception (group=0x41d68ac8) 
09-03 00:59:05.916: E/AndroidRuntime(13515): FATAL EXCEPTION: main 
09-03 00:59:05.916: E/AndroidRuntime(13515): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pocketbotanist/com.pocketbotanist.HomeScreen}: java.lang.ClassCastException: android.content.CursorLoader cannot be cast to android.database.Cursor 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread.access$700(ActivityThread.java:152) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.os.Looper.loop(Looper.java:137) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread.main(ActivityThread.java:5328) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at java.lang.reflect.Method.invokeNative(Native Method) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at java.lang.reflect.Method.invoke(Method.java:511) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at dalvik.system.NativeStart.main(Native Method) 
09-03 00:59:05.916: E/AndroidRuntime(13515): Caused by: java.lang.ClassCastException: android.content.CursorLoader cannot be cast to android.database.Cursor 
09-03 00:59:05.916: E/AndroidRuntime(13515): at com.pocketbotanist.HomeScreen.onCreateLoader(HomeScreen.java:175) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.LoaderManagerImpl.createLoader(LoaderManager.java:546) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:555) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.LoaderManagerImpl.initLoader(LoaderManager.java:609) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at com.pocketbotanist.HomeScreen.fillData(HomeScreen.java:188) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at com.pocketbotanist.HomeScreen.onCreate(HomeScreen.java:58) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.Activity.performCreate(Activity.java:5250) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
09-03 00:59:05.916: E/AndroidRuntime(13515): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
09-03 00:59:05.916: E/AndroidRuntime(13515): ... 11 more 
+0

내 답변이 도움이 되었습니까? – flx

답변

1

커서와 CursorLoader 다른 것들입니다. onCreateLoader()에서 쓸모없는 줄만 제거하십시오.

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 loader = new CursorLoader(this, 
      MyEntryContentProvider.CONTENT_URI, projection, null, null, null); 
    return loader; 
} 
+0

예, 대단히 도움이되었습니다! 나는 이제 다른 오류를 처리해야하지만 이것은 올바른 방향으로 나아가는 단계였습니다! 당신의 도움을 주셔서 대단히 감사합니다! – adamtw1

관련 문제