2013-09-30 104 views
1

我在我的應用程序中有一個數據庫,我使用一種形式使用edittext輸入數據,完成後用戶將單擊提交。我單擊之前輸入的其中一個列表數據,可以顯示之前已輸入的數據,並將其強制關閉。我不知道哪裏是我的錯, 這是我的數據庫:android.database.CursorIndexOutOfBoundsException:請求索引-1,大小爲7

 class DBSpaj extends SQLiteOpenHelper { 
     private static final String DATABASE_NAME="dbspaj.db"; 
     private static final int SCHEMA_VERSION=1; 

     public DBSpaj(Context context) { 
      super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("DROP TABLE IF EXISTS table_spaj"); 
      db.execSQL("CREATE TABLE if not exists table_spaj (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
        " agama TEXT,"+ 
        " agamatt TEXT,"+ 
        " alamat TEXT,"+ 
        " alamat_tt TEXT,"+ 
        " alamat_tagihan TEXT,"+ 
        " alamat_tagihan_tt TEXT,"+ 
        " alamatkantor TEXT,"+ 
        " curenttime TEXT," + 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // no-op, since will not be called until 2nd schema 
      // version exists 
     } 

     public Cursor getAll() { 
      return(getReadableDatabase() 
          .rawQuery("SELECT _id, agama,agamatt,alamat,alamat_tt,alamat_tagihan,alamat_tagihan_tt,alamatkantor,curenttime FROM table_spaj ORDER BY edit_nama_pp", null)); 

     } 

     public void insert(
       String agama, 
       String agamatt, 
       String alamat, 
       String alamat_tt, 
       String alamat_tagihan, 
       String alamat_tagihan_tt, 
       String alamatkantor, 
       String curenttime 
       ) { 
      ContentValues cv=new ContentValues(); 

      cv.put("agama", agama); 
      cv.put("agamatt", agamatt); 
      cv.put("alamat", alamat); 
      cv.put("alamat_tt", alamat_tt); 
      cv.put("alamat_tagihan", alamat_tagihan); 
      cv.put("alamat_tagihan_tt", alamat_tagihan_tt); 
      cv.put("alamatkantor", alamatkantor); 
      cv.put("curenttime", GetTime.getCurrentDate("yyyyMMddhhmmss")); 

      getWritableDatabase().insert("table_spaj", "name", cv); 
     } 

     public String getagama(Cursor c) { 
      return(c.getString(1)); 
     } 

     public String getagamatt(Cursor c) { 
      return(c.getString(2)); 
     } 

     public String getalamat(Cursor c) { 
      return(c.getString(3)); 
     } 

    public String getalamat_tt(Cursor c) { 
      return(c.getString(4)); 
     } 

    public String getalamat_tagihan(Cursor c) { 
      return(c.getString(5)); 
     } 

    public String getalamat_tagihan_tt(Cursor c) { 
      return(c.getString(6)); 
     } 

    public String getalamatkantor(Cursor c) { 
      return(c.getString(7)); 
    } 

    public String getcurenttime(Cursor c) { 
     return(c.getString(8)); 
    } 

這是類輸入數據到數據庫:

public class FormSpaj extends Activity { 
    Cursor model=null; 
    spaj1_adapter adapter=null; 
    DBSpaj helper=null; 

    private String selectedImagePath = ""; 
    String imgPath ; 

    View popupSet; 
    PopupWindow pw; 
    List<model_spaj1> listspaj=new ArrayList<model_spaj1>(); 
    private static final int CAMERA_REQUEST = 1888; 
    private DrawingView drawView; 
    int TAKE_PHOTO_CODE = 0; 
    public static int count=0; 
    final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/"; 
     ListView list; 

     Uri outputFileUri,mPhotoUri; 
     ContentValues values = new ContentValues(); 

     String type=null; 
     String type_tt=null; 
     String jekel=null; 
     String jekel_tt=null; 

     EditText agama,agamatt,alamat,alamat_tt,alamat_tagihan,alamat_tagihan_tt,alamatkantor,getcurenttime; 

     Spinner status,status_tt,jenis_kelamin_tt,jenis_kelamin; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.coba_form); 
     popUp = new PopupWindow(this); 
     layout = new LinearLayout(this); 

     helper=new DBSpaj(this); 
     model=helper.getAll(); 
     startManagingCursor(model); 
//  adapter=new spaj1_adapter(model); 

     agama=(EditText)findViewById(R.id.agama); 
     agamatt=(EditText)findViewById(R.id.agama_tt); 
     alamat=(EditText)findViewById(R.id.alamat); 
     alamat_tagihan=(EditText)findViewById(R.id.alamat_tagihan); 
     alamat_tagihan_tt=(EditText)findViewById(R.id.alamat_tagihan_tt); 
     alamat_tt=(EditText)findViewById(R.id.alamat_tt); 
     alamatkantor=(EditText)findViewById(R.id.alamatkantor); 
     getcurenttime=(EditText)findViewById(R.id.getcurenttime); 

     public boolean onCreateOptionsMenu(Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.cobaform, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.submit: 
        Submit(); 
        break; 
       case R.id.list_spaj: 
        dialogListSpaj(); 
        break; 
      } 
      return true; 
     } 


     @Override 
     public void onDestroy() { 
      super.onDestroy(); 

      helper.close(); 
     } 

     private void Submit() { 

      GetTime.getCurrentDate("yyyyMMddhhmmss"); 
      getcurenttime.setText(GetTime.getCurrentDate("yyyyMMddhhmmss")); 

      System.out.println(getcurenttime); 


      helper.insert(agama.getText().toString(), 
        agamatt.getText().toString(), 
        alamat.getText().toString(), 
        alamat_tt.getText().toString(), 
        alamat_tagihan.getText().toString(), 
        alamat_tagihan_tt.getText().toString(), 
        alamatkantor.getText().toString(), 
        getcurenttime.getText().toString() 
        ); 

      model.requery(); 
      agama.setText(null); 
      agamatt.setText(null); 
      alamat.setText(null); 
      alamat_tt.setText(null); 
      alamat_tagihan.setText(null); 
      alamat_tagihan_tt.setText(null); 
      alamatkantor.setText(null); 

     } 

     private void dialogListSpaj() { 
      LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE); 
      popupSet = inflater.inflate(R.layout.list_spaj1save, null); 
      closeBtn=(ImageView)popupSet.findViewById(R.id.closeBtn); 

      pw = new PopupWindow(popupSet, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); 
      ListView list = (ListView) popupSet.findViewById(android.R.id.list); 
      pw.showAtLocation(findViewById(R.id.coba_form), Gravity.CENTER, 0, 0); 
      adapter= new spaj1_adapter(model); 
      list.setAdapter(adapter); 
      list.setOnItemClickListener(onListClick); 

      closeBtn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        pw.dismiss(); 
       } 
      }); 
     } 


      private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
       pw.dismiss(); 
       model.moveToPosition(position); 
       agama.setText(helper.getagama(model)); 
       agamatt.setText(helper.getagamatt(model)); 
       alamat.setText(helper.getalamat(model)); 
       alamat_tt.setText(helper.getalamat_tt(model)); 
       alamat_tagihan.setText(helper.getalamat_tagihan(model)); 
       alamat_tagihan_tt.setText(helper.getalamat_tagihan_tt(model)); 
       alamatkantor.setText(helper.getalamatkantor(model)); 
       getcurenttime.setText(helper.getcurenttime(model)); 
       Intent in = new Intent(FormSpaj.this, SPajView.class); 

       startActivity(in); 

       } 

      }; 



     class spaj1_adapter extends CursorAdapter { 
      @SuppressWarnings("deprecation") 
      spaj1_adapter(Cursor c) { 
       super(FormSpaj.this, c); 
      } 

      @Override 
      public void bindView(View row, Context ctxt, 
                Cursor c) { 
       SpajHolder holder=(SpajHolder)row.getTag(); 

       holder.populateFrom(c, helper); 
      } 

      @Override 
      public View newView(Context ctxt, Cursor c, 
                ViewGroup parent) { 
       LayoutInflater inflater=getLayoutInflater(); 
       View row=inflater.inflate(R.layout.viewerlistspaj1, parent, false); 
       SpajHolder holder=new SpajHolder(row); 

       row.setTag(holder); 

       return(row); 
      } 


     } 

     static class SpajHolder { 
      private TextView nama=null; 
      private TextView nomor_registrasi=null; 

      private View row=null; 

      SpajHolder(View row) { 
       this.row=row; 

       nomor_registrasi=(TextView)row.findViewById(R.id.nomor_registrasi); 
       nama=(TextView)row.findViewById(R.id.nama); 
//    icon=(ImageView)row.findViewById(R.id.icon); 
      } 

      void populateFrom(Cursor c, DBSpaj helper) { 
       nama.setText(helper.getcurenttime(c)); 
       nomor_registrasi.setText(helper.getedit_nama_pp(c)); 
      } 
      }startActivityForResult(intent, TAKE_PHOTO_CODE); 
      } 

這是類節目的細節從表列表:

public class SPajView extends Activity { 
    Cursor model; 
    DBSpaj helper; 

    private String OUTPUT_FILE; 
     Button but,save,close,draw,set,set_tt; 
     boolean click = true; 
     private ImageView image_spaj,draw_image,startBtn,pauseRecord_Btn,stopBtn,playBtn,pauseBtn,closeBtn,playback_start,playback_pause,playback_stop; 

     private MediaPlayer mediaPlayer; 
     private MediaRecorder recorder; 
     Uri outputFileUri,mPhotoUri; 
     ContentValues values = new ContentValues(); 

    TextView agama,agamatt,alamat,alamat_tt,alamat_tagihan,alamat_tagihan_tt,alamatkantor,alamatkantor_tt,anak1, 
    anak1_tt,anak2,anak2_tt,anak3,anak3_tt,edit_bukti,edit_bukti_tt,edit_bulan,edit_bulan_tt,edit_ibu,edit_ibu_tt,edit_nama_pp, 
    edit_nama_tt,edit_nomor,edit_nomor_tt,edit_tahun,edit_tahun_tt,edit_tanggal,edit_tanggal_tt,edit_ttl,edit_ttl_tt, 
    edit_warga_negara,edit_warga_negara_tt,email_tt,email,hp,hp_tt,klasifikasi_industri, 
    klasifikasi_industri_tt,klasifikasi_pekerjaan,klasifikasi_pekerjaan_tt,kode_telepon,kode_telepon_tt,kode_telepon_kantor_tt, 
    kode_telepon_tagihan,kode_telepon_tagihan_tt,kodehp,kodehp_tt,kodepos,kodepos_kantor,kodepos_kantor_tt,kodepos_tagihan, 
    kodepos_tagihan_tt,kodepos_tt,kodetelepon_kantor,pendidikan,pendidikan_tt,penghasilan,penghasilan_tt, 
    suami,suami_tt,sumber,sumber_dana,sumber_dana_tt,sumber_tt,telepon,telepon_kantor,telepon_kantor_tt, 
    telepon_tagihan,telepon_tagihan_tt,telepon_tt,ttl_anak1,ttl_anak1_tt,ttl_anak2,ttl_anak2_tt,ttl_anak3,ttl_anak3_tt, 
    ttl_suami,ttl_suami_tt,tujuan,tujuan_tt,getcurenttime; 

    Spinner status,status_tt,jenis_kelamin_tt,jenis_kelamin; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.spaj1_view); 

      helper=new DBSpaj(this); 
      model=helper.getAll(); 
      startManagingCursor(model); 
      agama=(TextView)findViewById(R.id.agama); 
     agamatt=(TextView)findViewById(R.id.agama_tt); 
     alamat=(TextView)findViewById(R.id.alamat); 
     alamat_tagihan=(TextView)findViewById(R.id.alamat_tagihan); 
     alamat_tagihan_tt=(TextView)findViewById(R.id.alamat_tagihan_tt); 
     alamat_tt=(TextView)findViewById(R.id.alamat_tt); 
     alamatkantor=(TextView)findViewById(R.id.alamatkantor); 
     getcurenttime=(TextView)findViewById(R.id.getcurenttime); 


      agama.setText(helper.getagama(model)); 
      agamatt.setText(helper.getagamatt(model)); 
      alamat.setText(helper.getalamat(model)); 
      alamat_tt.setText(helper.getalamat_tt(model)); 
      alamat_tagihan.setText(helper.getalamat_tagihan(model)); 
      alamat_tagihan_tt.setText(helper.getalamat_tagihan_tt(model)); 
      alamatkantor.setText(helper.getalamatkantor(model)); 

      getcurenttime.setText(helper.getcurenttime(model)); 

    } 

    } 

這是我的logcat:

09-30 14:45:42.532: E/AndroidRuntime(19033): FATAL EXCEPTION: main 
09-30 14:45:42.532: E/AndroidRuntime(19033): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.touch/org.example.touch.SPajView}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 7 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.os.Looper.loop(Looper.java:137) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread.main(ActivityThread.java:4895) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at java.lang.reflect.Method.invokeNative(Native Method) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at java.lang.reflect.Method.invoke(Method.java:511) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at dalvik.system.NativeStart.main(Native Method) 
09-30 14:45:42.532: E/AndroidRuntime(19033): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 7 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at org.example.touch.DBSpaj.getagama(DBSpaj.java:320) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at org.example.touch.SPajView.onCreate(SPajView.java:156) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.Activity.performCreate(Activity.java:5163) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
09-30 14:45:42.532: E/AndroidRuntime(19033): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
09-30 14:45:42.532: E/AndroidRuntime(19033): ... 11 more 

我不知道爲什麼我不能顯示之前輸入的數據,希望有人能幫我解決我的問題,謝謝。

回答

5

當您的查詢返回一個新的遊標時,它最初指向結果索引-1,這意味着「在第一行之前」。您必須首先在光標上調用其中一個移動方法,例如moveToFirst()以將其移動到有效的結果行。 (檢查移動的結果以確保它指向有效的行。)

在您的堆棧跟蹤中,您可以看到在您的SPajView.onCreate()中游標行訪問爲getagama()。因此,要解決這個特定的碰撞,添加以下moveToFirst()SPajView.onCreate()

if (model.moveToFirst()) { 
    agama.setText(helper.getagama(model)); 
    //... 
} 
+0

我還是不明白,你能發表一個代碼嗎? –

+0

它在第二項活動中不顯示任何內容。 –

0

你不使用這樣的:

agama.setText(helper.getagama(model)); 
    agamatt.setText(helper.getagamatt(model)); 
    alamat.setText(helper.getalamat(model)); 
    alamat_tt.setText(helper.getalamat_tt(model)); 
    alamat_tagihan.setText(helper.getalamat_tagihan(model)); 
    alamat_tagihan_tt.setText(helper.getalamat_tagihan_tt(model)); 
    alamatkantor.setText(helper.getalamatkantor(model)); 

    getcurenttime.setText(helper.getcurenttime(model)); 

因爲model返回遊標。您可以使用SimpleCursorAdapter

請參閱this教程或this非常有用。

+0

那我該怎麼辦? –

+0

請參閱http://thinkandroid.wordpress.com/2010/01/09/simplecursoradapters-and-listviews/ tutorial –

相關問題