رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

مشکل در کوِئری از دیتابیس


پست های پیشنهاد شده

سلام دوستان یه سری سوال دارم میخوام اگه کاربر میبینه میخوام مقدار ستون answer_state ام تو دیتابیس از 0 تبدیل بشه به 1 

کوئری هم زدم به این شکل 

 public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

 

توی اکتیویتی سوال هم اونو گرفتم 

private void setAnswerState(int postId) {

        dbHelper = new DatabaseManager(
                this, DatabaseManager.DB_NAME);
        try {
            dbHelper.importIfNotExist();
        } catch (IOException e) {
            e.printStackTrace();
        }
        dbHelper.setAnswerState(postId, 1);
    }

 

و توی متد آنکریت هم تعریفش کردم و مقدار آیدی هر سوال رو بهش دادم(با اینتنت) : 

setAnswerState(qid);

 

و در نهایت وقتی وارد اکتیویتی سوالم میشم هم لاگ رو دارم که همونطوری که میبینید مقدار لاگ هم تغییر میکنه ظاهرا !!!

04-17 06:57:14.846 6646-6646/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-17 06:57:20.500 6646-6646/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1

اما چرا اعمال نمیشه روی دیتابیس و توی دیتا مدلم؟!!!

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 22 دقیقه قبل، hamidreza.kh گفته است :

سلام دوستان یه سری سوال دارم میخوام اگه کاربر میبینه میخوام مقدار ستون answer_state ام تو دیتابیس از 0 تبدیل بشه به 1 

کوئری هم زدم به این شکل 


 public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

 

توی اکتیویتی سوال هم اونو گرفتم 


private void setAnswerState(int postId) {

        dbHelper = new DatabaseManager(
                this, DatabaseManager.DB_NAME);
        try {
            dbHelper.importIfNotExist();
        } catch (IOException e) {
            e.printStackTrace();
        }
        dbHelper.setAnswerState(postId, 1);
    }

 

و توی متد آنکریت هم تعریفش کردم و مقدار آیدی هر سوال رو بهش دادم(با اینتنت) : 


setAnswerState(qid);

 

و در نهایت وقتی وارد اکتیویتی سوالم میشم هم لاگ رو دارم که همونطوری که میبینید مقدار لاگ هم تغییر میکنه ظاهرا !!!


04-17 06:57:14.846 6646-6646/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-17 06:57:20.500 6646-6646/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1

اما چرا اعمال نمیشه روی دیتابیس و توی دیتا مدلم؟!!!

سلام دوست عزیز خوب خطایی هم میده؟

از دیتابیس کوئری select گرفتین ببینید که تو دیتابیس تغییر کرده یا نه؟

کجا اعمال نشده ؟ تو لایوت هاتون منظورتونه اعمال نمیشه؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 50 دقیقه قبل، a.khosroabadi گفته است :

سلام دوست عزیز خوب خطایی هم میده؟

از دیتابیس کوئری select گرفتین ببینید که تو دیتابیس تغییر کرده یا نه؟

کجا اعمال نشده ؟ تو لایوت هاتون منظورتونه اعمال نمیشه؟

سلام

خطایی نمیده ، اما ظاهرا اعمال هم نمیشه ، با این دستور میگیرم پست هام رو

 public List<Quiz> getQuizes() {

        List<Quiz> quizes = new ArrayList<>();

        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();

        Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + DB_TABLE_QUIZ + " WHERE seasson_flag = 1 ", null);
        cursor.moveToFirst();
        if (cursor.getCount() > 0) {
            while (!cursor.isAfterLast()) {
                Quiz quiz = new Quiz();

                quiz.setId(cursor.getInt(0));
                quiz.setQuestion(cursor.getString(1));
                quiz.setOptA(cursor.getString(2));
                quiz.setOptB(cursor.getString(3));
                quiz.setOptC(cursor.getString(4));
                quiz.setOptD(cursor.getString(5));
                quiz.setAnswer(cursor.getInt(6));
                quiz.setIcType(cursor.getString(7));
                quiz.setAnswerState(cursor.getInt(9));

                quizes.add(quiz);
                cursor.moveToNext();
            }
        }
        cursor.close();
        sqLiteDatabase.close();
        return quizes;
    }

 

و با این تیکه کد میخوام که اعمال شدنش رو توی بکگراند آیتم هام توی ریسایکلر ویوم مشاهده کنم،و وقتی که میگیرم اون رو از دیتا مدلم ، همیشه مقدار صفر رو برمیگردونه و در واقع بکگراند آیتم ها در ریسایکلر ویو همیشه قرمز هست ! درحالی که اگه تغییر کنه مقدارش باید نارنجی بشه !

 if (quiz.getAnswerState()==0){

            holder.itemView.setBackgroundColor(ContextCompat.getColor(context,android.R.color.holo_red_light));
        }else {

            holder.itemView.setBackgroundColor(ContextCompat.getColor(context,android.R.color.holo_orange_dark));
        }

 

در واقع اینجا اصلا اعمال نمیشه !

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 23 دقیقه قبل، hamidreza.kh گفته است :

سلام

خطایی نمیده ، اما ظاهرا اعمال هم نمیشه ، با این دستور میگیرم پست هام رو


 public List<Quiz> getQuizes() {

        List<Quiz> quizes = new ArrayList<>();

        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();

        Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + DB_TABLE_QUIZ + " WHERE seasson_flag = 1 ", null);
        cursor.moveToFirst();
        if (cursor.getCount() > 0) {
            while (!cursor.isAfterLast()) {
                Quiz quiz = new Quiz();

                quiz.setId(cursor.getInt(0));
                quiz.setQuestion(cursor.getString(1));
                quiz.setOptA(cursor.getString(2));
                quiz.setOptB(cursor.getString(3));
                quiz.setOptC(cursor.getString(4));
                quiz.setOptD(cursor.getString(5));
                quiz.setAnswer(cursor.getInt(6));
                quiz.setIcType(cursor.getString(7));
                quiz.setAnswerState(cursor.getInt(9));

                quizes.add(quiz);
                cursor.moveToNext();
            }
        }
        cursor.close();
        sqLiteDatabase.close();
        return quizes;
    }

 

و با این تیکه کد میخوام که اعمال شدنش رو توی بکگراند آیتم هام توی ریسایکلر ویوم مشاهده کنم،و وقتی که میگیرم اون رو از دیتا مدلم ، همیشه مقدار صفر رو برمیگردونه و در واقع بکگراند آیتم ها در ریسایکلر ویو همیشه قرمز هست ! درحالی که اگه تغییر کنه مقدارش باید نارنجی بشه !


 if (quiz.getAnswerState()==0){

            holder.itemView.setBackgroundColor(ContextCompat.getColor(context,android.R.color.holo_red_light));
        }else {

            holder.itemView.setBackgroundColor(ContextCompat.getColor(context,android.R.color.holo_orange_dark));
        }

 

در واقع اینجا اصلا اعمال نمیشه !

اگه اشتباه نکن شما تو این متد 

public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

دارین مقدار رکورد answer_state  برابر با 1 قرار میدین ولی تو متد getQuize دارین با کوئری زیر 

Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + DB_TABLE_QUIZ + " WHERE seasson_flag = 1 ", null);

از جدولتون میخونید که تو این کوئری دارین مقدار ستون seasson_flag برابر با یک میزارین تو شرط

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 5 دقیقه قبل، a.khosroabadi گفته است :

اگه اشتباه نکن شما تو این متد 


public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

دارین مقدار رکورد answer_state  برابر با 1 قرار میدین ولی تو متد getQuize دارین با کوئری زیر 


Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + DB_TABLE_QUIZ + " WHERE seasson_flag = 1 ", null);

از جدولتون میخونید که تو این کوئری دارین مقدار ستون seasson_flag برابر با یک میزارین تو شرط

ممنون بابت پاسخگویی دوباره تون

نخیر من answer_state رو میخوام برابر یک بزارم که هر وقت پستی دیده شد مثلا یه اطلاعی کاربر داشته باشه

اما اونجا که مقدار seasson_flag =1 رو میگیرم در واقع این بحثش جداست میخوام پستایی که seasson_flag شون برابر با یک هست رو توی این کوئری بگیرم ک خب خود همین پستا (اینایی که سیزن فلگ1 دارن هم میتونن مقدار answer_state 1 داشته باشن !!!) در واقع دارم اینو 

quiz.setAnswerState(cursor.getInt(9));

 

اینجا ست میکنم،خب ؟ بعد توی آداپترم توی اون پست بالا دارم اونو میگیرم با متد getAnswerState که متاسفانه تغییر نمیکنه ! 

بنظر خودم هرچی چک کردم کوئریم مشکلی نداره هرچی هست اون آیدی هست که توی اکتیویتی هدف بهش میدم 

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 13 دقیقه قبل، hamidreza.kh گفته است :

ممنون بابت پاسخگویی دوباره تون

نخیر من answer_state رو میخوام برابر یک بزارم که هر وقت پستی دیده شد مثلا یه اطلاعی کاربر داشته باشه

اما اونجا که مقدار seasson_flag =1 رو میگیرم در واقع این بحثش جداست میخوام پستایی که seasson_flag شون برابر با یک هست رو توی این کوئری بگیرم ک خب خود همین پستا (اینایی که سیزن فلگ1 دارن هم میتونن مقدار answer_state 1 داشته باشن !!!) در واقع دارم اینو 


quiz.setAnswerState(cursor.getInt(9));

 

اینجا ست میکنم،خب ؟ بعد توی آداپترم توی اون پست بالا دارم اونو میگیرم با متد getAnswerState که متاسفانه تغییر نمیکنه ! 

بنظر خودم هرچی چک کردم کوئریم مشکلی نداره هرچی هست اون آیدی هست که توی اکتیویتی هدف بهش میدم 

یک لاگ بزارین ببینید چه id دارین پاس میدین برای تغییر استاتوس و به نظرم یک لیست کلی هم از دیتابیس بگیرین ببینید چه اید هایی تغییر کرده

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در در 1396/01/28, 13:38:29، a.khosroabadi گفته است :

یک لاگ بزارین ببینید چه id دارین پاس میدین برای تغییر استاتوس و به نظرم یک لیست کلی هم از دیتابیس بگیرین ببینید چه اید هایی تغییر کرده

این لاگی ک گرفتم که نشون میده آیدی هایی که دارم پاس میدم درست هستش و مشکلی نداره دیگه درسته؟!

04-18 13:19:55.211 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>1
04-18 13:19:58.129 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>2
04-18 13:20:00.409 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>4
04-18 13:20:02.393 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>6
04-18 13:20:04.888 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>31
04-18 13:20:07.089 9774-9774/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>20

لیست کلی که هم که میگیرم از دیتابیس (یعنی بدون اینکه بخوام شرط بزارم که seasson flag برابر با یک باشه) وقتی میگیرم بازم تفاوتی نداره ! 

حالا نمیدونم با این لاگ بالا نشون میده که آیدی رو درست بهش پاس میدم،و با اون لاگی که توی دیتابیس منیجرم هستش و مقدار rowAffected اونم نشون میده واقعا که مقدار answer_state به 1 تغییر میکنه برای هر آیدی اما واقعا چرا این تغییر موندگار نیست؟! یا یه جای کار میلنگه؟ آیا احتمال این وجود داره که مقدار answer_state از 0 تبدیل به 1 بشه اما نمونه و بعد از اجرای دوباره اپ دوباره همون مقدار 0 بشه؟!

لینک ارسال
به اشتراک گذاری در سایت های دیگر

پی نویس پست بالام 

 

04-18 13:32:01.161 20635-20635/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-18 13:32:01.161 20635-20635/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>1
04-18 13:32:03.200 20635-20635/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-18 13:32:03.200 20635-20635/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>19
04-18 13:32:04.841 20635-20635/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-18 13:32:04.843 20635-20635/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>8
04-18 13:32:07.194 20635-20635/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-18 13:32:07.194 20635-20635/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>26
04-18 13:32:12.724 20635-20635/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-18 13:32:12.725 20635-20635/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>33

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

یه مورد عجیبی ک تازه بهش برخوردم اینه که 

 private void setAnswerState(int postId) {

        dbHelper = new DatabaseManager(
                this, DatabaseManager.DB_NAME);
        try {
            dbHelper.importIfNotExist();
        } catch (IOException e) {
            e.printStackTrace();
        }
            dbHelper.setAnswerState(postId,1);
    }

من اینجا مقدار 1 رو هر مقداری بدم بازم همون متدم توی مدیریت دیتابیسم یعنی این متد پایین مقدار 1 برمیگردونه !!!! یعنی  من اینجا جای 1 4 و 5 هم تست کردم اما بازم متن پایین همش به عنوان rowAffected مقدار 1 رو برمیگردونه!!! بظرتون این طبیعی هستش؟!

public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

اینم مدرکش 

04-19 07:18:47.487 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:47.487 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>1
04-19 07:18:54.228 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:54.228 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>10
04-19 07:18:58.128 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:58.128 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>28

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 3 دقیقه قبل، hamidreza.kh گفته است :

یه مورد عجیبی ک تازه بهش برخوردم اینه که 


 private void setAnswerState(int postId) {

        dbHelper = new DatabaseManager(
                this, DatabaseManager.DB_NAME);
        try {
            dbHelper.importIfNotExist();
        } catch (IOException e) {
            e.printStackTrace();
        }
            dbHelper.setAnswerState(postId,1);
    }

من اینجا مقدار 1 رو هر مقداری بدم بازم همون متدم توی مدیریت دیتابیسم یعنی این متد پایین مقدار 1 برمیگردونه !!!! یعنی  من اینجا جای 1 4 و 5 هم تست کردم اما بازم متن پایین همش به عنوان rowAffected مقدار 1 رو برمیگردونه!!! بظرتون این طبیعی هستش؟!


public void setAnswerState(int postId, int answerState){

        SQLiteDatabase sqLiteDatabase=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("answer_state" , answerState);
        int rowAffected=sqLiteDatabase.update(DB_TABLE_QUIZ,contentValues,"id = ?" ,new String[]{String.valueOf(postId)});
        Log.i(TAG, "setAnswerState: rowAffected=> " +rowAffected);
        sqLiteDatabase.close();

    }

اینم مدرکش 


04-19 07:18:47.487 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:47.487 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>1
04-19 07:18:54.228 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:54.228 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>10
04-19 07:18:58.128 2330-2330/com.becomealegend.hamidrezakh I/ContentValues: setAnswerState: rowAffected=> 1
04-19 07:18:58.128 2330-2330/com.becomealegend.hamidrezakh I/onCreate: setAnswerStateId: id=>28

 

سلام روز بخیر منظورتون تو دیتابیس این ستون از چه نوعی هستش؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 12 دقیقه قبل، a.khosroabadi گفته است :

سلام روز بخیر منظورتون تو دیتابیس این ستون از چه نوعی هستش؟

ظهر شماهم بخیر آقای خسروآبادی

این دیتابیس منه

79an_%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 2 دقیقه قبل، hamidreza.kh گفته است :

ظهر شماهم بخیر آقای خسروآبادی

این دیتابیس منه

79an_%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8

منظور از rowAffected این هستش که 1 سطر از جدول تغییر کرده

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 36 دقیقه قبل، a.khosroabadi گفته است :

منظور از rowAffected این هستش که 1 سطر از جدول تغییر کرده

آها من فک کردم مقداری که تغییر کرده رو نشون میده ، خب پس اینا اوکین پس چرا اعمال نمیشه؟! بنظرتون مشکل از کجاست؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 3 دقیقه قبل، hamidreza.kh گفته است :

آها من فک کردم مقداری که تغییر کرده رو نشون میده ، خب پس اینا اوکین پس چرا اعمال نمیشه؟! بنظرتون مشکل از کجاست؟

اگه ممکنه همه کدتونو بدین چک کنم

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در 3 ساعت قبل، a.khosroabadi گفته است :

اگه ممکنه همه کدتونو بدین چک کنم

چشم الان میفرستم براتون تو خصوصی

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...