آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل دیتابیس(لطفا یه بار دیگه ببینید)

MJZ376  12 سال پیش  12 سال پیش
0 0

باسلام

نرم افزار من از یک دیتابیس استفاده میکنه

وقتی نرم افزار رو روی گوشی اجرا میکنم کرش میکنه

اما روی امولیتور درست اجرا میشه و درهنگام اجرا شدن یه خطا میگیره

Finalizing a Cursor that has not been deactivated or closed. database = /data/data/mjz.soal_pasokh.mkh/databases/namaz, table = namaz, query = SELECT id, soal, aye, pasokh, fav, ezafi1, ezafi2, ezafi3 FROM namaz

و بعد از این خط اینو نوشته

android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

که این خطا با توجه به کمک دوستان که گفتن cursor باید بسته بشه حل شد و من cursor رو بستم

اما حالا یه مشکل جدید بعد از حل این مشکل درست شده که این هست

java.lang.RuntimeException: Unable to start activity ComponentInfo{mjz.soal_pasokh.mkh/mjz.soal_pasokh.mkh.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT id, soal, aye, pasokh, fav, ezafi1, ezafi2, ezafi3 FROM namaz) 

این خطا میگه تلاش برای دوباره باز کردن یک شی در حال حاضر بسته

اما منظورش رو نمیدونم

این کد DBAdapter برنامم

 public DBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }


    private static class DatabaseHelper extends SQLiteOpenHelper
    {

        DatabaseHelper(Context context)
        {
            //DATABASE_VERSION = 1
            super(context, DATABASE_NAME, null, 1);
        }


        @Override
        public void onCreate(SQLiteDatabase db)
        {
            try {
                db.execSQL(CREATE_TABLE);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");

            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }


    //---opens the database---
    public DBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }


    //---closes the database---
    public void close()
    {
        DBHelper.close();
    }


    //---retrieves all the contacts---
    public List<soal_pasokh> getAllContacts()
    {
        Cursor cursor = db.query(DATABASE_TABLE, yek_name, null, null, null, null, null);
        List<soal_pasokh> nams = cursorToList(cursor);
        return nams;
    }


    private List<soal_pasokh> cursorToList(Cursor cursor) {
        List<soal_pasokh> nams = new ArrayList<soal_pasokh>();
        if (cursor.getCount() > 0)
        {
            while (cursor.moveToNext()) {
                soal_pasokh nam = new soal_pasokh();
                nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
                nam.setSoal(cursor.getString(cursor.getColumnIndex(KEY_SOAL)));
                nam.setAye(cursor.getString(cursor.getColumnIndex(KEY_AYE)));
                nam.setPasokh(cursor.getString(cursor.getColumnIndex(KEY_PASOKH)));
                nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
                nam.setEzafi1(cursor.getString(cursor.getColumnIndex(KEY_EXTRA1)));
                nam.setEzafi2(cursor.getString(cursor.getColumnIndex(KEY_EXTRA2)));
                nam.setEzafi3(cursor.getString(cursor.getColumnIndex(KEY_EXTRA3)));

                nams.add(nam);
            }
            ;
        }
        return nams;
    }


    //---retrieves a particular contact---
    public soal_pasokh getContact(int new_id) throws SQLException
    {
        List<soal_pasokh> nams = new ArrayList<soal_pasokh>();
        Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_ID + " == '" + new_id + "'", null,
                null, null, null, null);
        soal_pasokh nam = new soal_pasokh();
        if (cursor != null) {
            cursor.moveToFirst();

            nams = cursorToList(cursor);
        }
        Log.i(TAG, nam.getSoal() + ",database");
        return nams.get(0);
    }


    ///search
    public List<soal_pasokh> findContacts(String nam, String row) throws SQLException
    {
        Cursor cursor =
                db.query(true, DATABASE_TABLE, yek_name, row + " LIKE '%" + nam + "%'", null,
                        null, null, null, null);

        List<soal_pasokh> nams = cursorToList(cursor);
        return nams;
    }


    ///fav?
    public List<soal_pasokh> findFAVContacts() throws SQLException
    {
        Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_FAV + " == " + 1 + "", null,
                null, null, null, null);

        List<soal_pasokh> nams = cursorToList(cursor);
        return nams;
    }


    //---updates a contact---
    public boolean updateContact(soal_pasokh up_nam)
    {
        ContentValues args = new ContentValues();
        args.put(KEY_ID, up_nam.getId());
        args.put(KEY_SOAL, up_nam.getSoal());
        args.put(KEY_AYE, up_nam.getAye());
        args.put(KEY_PASOKH, up_nam.getPasokh());
        args.put(KEY_FAV, up_nam.getFav());
        args.put(KEY_EXTRA1, up_nam.getEzafi1());
        args.put(KEY_EXTRA2, up_nam.getEzafi2());
        args.put(KEY_EXTRA3, up_nam.getEZafi3());

        return db.update(DATABASE_TABLE, args, KEY_ID + "=" + up_nam.getId(), null) > 0;
    }

}

 

اینم MainActivity 

  lst = getListView();
        db = new DBAdapter(getBaseContext());
        db.open();
        soalha = db.getAllContacts();
        lst.setLayoutAnimation(new LayoutAnimationController(animation1));

        if (soalha.size() == 0) {

            String so_paPath = "/data/data/" + getPackageName()
                    + "/databases/";

            try {
                CopyDB(getBaseContext().getAssets().open("mydata1"), new FileOutputStream(so_paPath + "/namaz"));
                Log.i(DBAdapter.TAG, "db copy shod");
                soalha = db.getAllContacts();
                refreshDisplay();
                Log.i(DBAdapter.TAG, soalha.size() + "= tedad soalha");
            }
            catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } else {
            refreshDisplay();
        }
    }


    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);

        soal_pasokh soal_pasokh = soalha.get(position);

        Intent next = new Intent(this, showSoal.class);
        next.putExtra("thissoal", soal_pasokh);
        startActivity(next);

    }


    public void CopyDB(InputStream inputStream, OutputStream outputStream)
                                                                          throws IOException {
        // ---copy 1K bytes at a time---
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }


    public void refreshDisplay() {

        Log.i(DBAdapter.TAG, soalha.size() + "= tedade soalha");

        ArrayAdapter<soal_pasokh> adapter = new soal_pasokhAdapter(this, soalha);
        setListAdapter(adapter);
    }


    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        currentPosition = lst.getFirstVisiblePosition();
        Log.i(DBAdapter.TAG, currentPosition + "save shod");
        db.close();
    }


    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        db.open();
        soalha = db.getAllContacts();
        lst.post(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                lst.setSelection(currentPosition);
            }
        });

        refreshDisplay();
    }

}
+1 0
معمولا برای استفاده اشتباه از دستوراتی مثل دستورات Sqlite این خطا رو میده، خطی که در برنامتون باعث crash میشه در زیر همین پیغام مینویسه دیگه، اگه ممکنه سورس برنامت رو با عکس کلی مربوط به خطا رو بزار تا اگه شد مشکلشو پیدا کنیم (در مورد این خط کدی هم که گذاشتید حتما خودتون از من بهتر میتونید معنی کنید، داره میگه: "تلاش برای باز کردن مجدد شیئی که قبلا بسته شده است!" ). (12 سال پیش)
+1 0
دوستان یه نگاه دیگه بندازین همه ی کد ها رو هم قرار دادم (12 سال پیش)
+1 0
هر چی هست مطمئن باش که مربوط به دستور Select و Quary گرفتن از دیتابیست میشه،بعدشم جسارت نباشه دوست عزیزم اما نمیدونم یکم شیوه ی کد نویسی شما وبنظرم غیر روتین میومد و کدهات حالت ساخت یافته نداره، بهرحال شما فصل 8 قسمت 2 از آموزشهای استاد رو که در مورد دیباگ و خطایابی هست رو دیدید؟ (12 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
iSheykhi  12 سال پیش
+1 0

در MainActivity

این خط رو

 String so_paPath ="/data/data/"+ getPackageName()+"/databases/";

به

 String so_paPath ="/data/data/"+ packageinfo.packageName+"/databases/";

تغییر بده تا توی پکیجت بی افته


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .