android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为7

时间:2013-09-30 08:15:08

标签: java android database android-sqlite android-logcat

我的应用程序中有一个数据库,我使用一个表单使用edittext输入数据,完成后,用户将单击提交。我点击之前输入的列表数据之一到另一个活动,以显示之前输入的数据,它会强制关闭。我不知道我的错在哪里 这是我的数据库:

        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

我不知道为什么我不能显示我之前输入的数据,我希望有人可以帮我解决我的问题,谢谢。

2 个答案:

答案 0 :(得分:5)

当您的查询返回一个新游标时,它最初指向结果索引-1,这意味着“在第一行之前”。您必须先在光标上调用其中一个移动方法,例如moveToFirst(),然后将其移动到有效的结果行。 (检查移动的结果以确保它指向有效行。)

在您的堆栈跟踪中,您可以看到getagama()中的光标行访问权限为SPajView.onCreate()。因此,要修复此特定崩溃,请在moveToFirst()中添加以下SPajView.onCreate()

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

答案 1 :(得分: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返回了Cursor。另外,您可以使用SimpleCursorAdapter

请参阅this教程或this非常有用。