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

مشکل در آپدیت لیست ویو با داده های بانک اطلاعات sqlite

Reza.M  12 سال پیش  12 سال پیش
0 0

دوستان و اساتید محترم سلام.

طاعات و عباداتتون قبول درگاه حق .انشالله...

لیست ویویی دارم که اطلاعاتش رو از بانک sqlite نمایش میده
بانکی هم که ازش حرف میزنم در حد خیلی خیلی ساده اس
- id
- subject
- title

دو تا اکتیویتی دارم
یکی واسه موضوعات که کاربر انتخاب میکنه (دقیقا صفحه منو که موضوعات رو نشون میده مثلا سه تا دسته بندی :  روانشناسی ، آموزشی و متفرقه )
یکی هم واسه لیست ویو

میخوام تو اکتیویتی اصلی که کاربر موضوع رو انتخاب کرد بره صفحه دومی (لیست ویو) و هرچی رکورد (title)  که با دسته بندی (subject) مطابقت میکنه رو نشون بده.
مشکلی اصلی اینجاس وقتی عنوان موضوع رو با intent به صفحه لیست ویو میفرستم برای اولین بار درست کار میکنه ولی وقتی دکمه back رو میزنم و  روی یه موضوع دیگه کلیک میکنم دوباره همون اطلاعات موضوع قبلی که انتخاب شده رو نشون میده 

برای اینکه بتونم منظورمو برسونم کدها رم همینجا میذارم.

این صفحه انتخاب موضوع (صفحه منو)

 public class ActivityMenu extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        Button ravanshenasi = (Button) findViewById(R.id.btn1);
        Button amoozeshi = (Button) findViewById(R.id.btn2);
        Button motafarreghe = (Button) findViewById(R.id.btn3);
        

        OnClickListener numberClickListener = new OnClickListener() {

            @Override
            public void onClick(View view) {
                Button btn = (Button) view;
                String category = btn.getText().toString();
Intent intent = new Intent(ActivityMenu.this, ActivityMain.class); intent.putExtra("CATEGORY", category); ActivityMenu.this.startActivity(intent); } }; ravanshenasi.setOnClickListener(numberClickListener);
amoozeshi.setOnClickListener(numberClickListener);
motafarreghe.setOnClickListener(numberClickListener);
} }

اینم صفحه نمایش لیست ویو

 public class ActivityMain extends Activity {

    public ArrayAdapter adapter;
    public String       category;


    @Override
    protected void onResume() {
        G.currentActivity = this;
        super.onResume();
        if (adapter != null) {
            adapter.notifyDataSetChanged();
        }
    }

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lstContent = (ListView) findViewById(R.id.lstContent); adapter = new AdapterNote(G.notes); lstContent.setAdapter(adapter); Bundle extras = getIntent().getExtras(); if (extras.containsKey("CATEGORY")) { category = extras.getString("CATEGORY"); }
Cursor cursor = G.database.rawQuery("SELECT * FROM book WHERE subject='" + category + "'", null); while (cursor.moveToNext()) { StructNote book_title = new StructNote(); book_title.title= cursor.getString(cursor.getColumnIndex("title"));
G.notes.add(book_title);
} cursor.close(); adapter.notifyDataSetChanged(); } }

البته صفحه StructNote

 public class StructNote {

    public String title;

}

 پیشاپیش از راهنمایی هاتون سپاسگزارم

0 0
کدتون به قسمت onResume نیازی نداره ، چون محتوا درonCreate ایجاد میشه و محتوا ثابت هست ، onResume عملا کاری اضافه هست که تاثیری در خروجی نداره (12 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
underomeda  12 سال پیش
0 0

اگه مشکل نمایش دیتا نداری بخاطر اینه که لیست ویو رو با ادپترت ست نکردی.پاینن این خط 

  adapter.notifyDataSetChanged();

اینو بنویس:

 listview.setadapter(adapter);
  
 


پاسخ به سوال 
مجتبی یگانه  12 سال پیش
+1 0

اصولی کار نکردید ! این پاسخ سوالتون نیست ولی میتونه کمکتون کنه مشکل حل بشه

دسته بندی ها را در یک جدول دیگه ذخیره کنید و با id دسته بند  ، مطالب رو به اون دسته مرتبط کنید 

 id | cat_name
1 | روانشناسی
2 | آموزشی
3 | متفرقه
-------------------------

Table Content
-------------------------
id | Text | cat_id
1 | text1 | 1
2 | text2 | 2

حالا کافیه یه مقدار int به اون صفحه پاس بدید و در کوئری اجرا کنید ، اگر تعداد دسته ها کمه و براتون سخته جدول درست کنید ، می تونید مقدار ها رو خودتون پردازش کنید اما اصلا توصیه نمیشه که کوئری رو به اون شکل بنویسید و در ضمن احتمال زیاد کوئری هم مشکل داره و باید به این شکل بشه 

SELECT * FROM book WHERE subject LIKE 'آموزشی'

و اگر طبق روشی که من گفتم پیش برید کوئری به این شکل و قابل اطمینان تر میشه

 SELECT * FROM book WHERE cat_id = 1
0 0
ممنون پس نظر شما اینه که دوتا جدول داشته باشم. ولی چیزی که متعجبم کرده اینه که اولین باری که روی یه گزینه مثلا روانشناسی کلیک میشه ، محتویات یا اطلاعات اون دسته بندی بخوبی نشون داده میشن بعد وقتی دکمه back زده میشه و یه گزینه دیگه انتخاب میشه دوباره همون محتوای دسته بندی روانشناسی رو نشون میده ، آیا این مشکل بخاطر نبود دوتا جدوله ؟ یعنی یه جدول واسه دسته بندی یه جدول هم واسه محتوا؟ (12 سال پیش)
0 0
کد پاسخ پائین ام رو ببینید ، یکی اینکه آرایه رو پاک نمی کردید - یکی هم اینکه ممکنه کوئری تون مشکل داشته باشه ، پس کوئری را در هربار اجرا چاپ کنید ببینید آیا تغییر میکنه یا نه! (12 سال پیش)
پاسخ به سوال 
مجتبی یگانه  12 سال پیش
+2 0

هر چند با این روش مخالف ام ، اما یه سری ایراداتی که وجود داشت رو بر طرف کردم ، امیدوارم کمک کنه

public class ActivityMain extends Activity {

    public ArrayAdapter adapter;
    public String       category;


    @Override
    protected void onResume() {
        G.currentActivity = this;
        super.onResume();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lstContent = (ListView) findViewById(R.id.lstContent);
        adapter = new AdapterNote(G.notes);
        lstContent.setAdapter(adapter);

        Bundle extras = getIntent().getExtras();
        if (extras!=null && extras.containsKey("CATEGORY")) {
            category = extras.getString("CATEGORY");
	    Cursor cursor = G.database.rawQuery("SELECT * FROM book WHERE subject LIKE '" + category + "'", null);
	     /////////
	     G.notes.clear();
	     /////////
	     while (cursor.moveToNext()) {
	        StructNote book_title = new StructNote();
		book_title.title= cursor.getString(cursor.getColumnIndex("title"));
		G.notes.add(book_title);
	     }
	     cursor.close();
	     adapter.notifyDataSetChanged();
        }
	else{
	    finish();
	}
    }

}
0 0
داداش قربونت، چرا بااین روش مخالفی ؟مخالف نباش چون جواب داد. مشکل تو پاک نکردن آرایه بود. یه سوال مبتدیانه دیگه میپرسم شرمنده دیگه جور ما رو میکشید... همین برنامه رو امولاتور بدرستی کار میکنه و محتوا رو از بانک میخونه ، ولی زمانی که برنامه رو میخوام رو گوشی تست کنم اطلاعات درخواست شده از بانک رو نشون نمیده ، میخواستم بپرسم ایراد کار کجاست ، تو کدنویسی مه یا خروجی گرفتن apk ? بازم ممنون (12 سال پیش)
0 0
خروجی گرفتن که فرقی نداره ، ولی معمولا ما یادمون میره یه سری مجوز ها رو بگیریم و شبیه ساز ارور نمیده اما گوشی حتما برای اجرای کد بهش نیاز داره ، مثلا جنی موشن به مجوز نوشتن روی کارت حافظه نیاز نداره ، درحالی که در دستگاه واقعی باعث کرش میشه پس بهترین راه برسی لاگ ها هست (12 سال پیش)
0 0
هزار تا روش هست که جواب میده ، اما اینکه کدوم اصولی تر و بهینه تر هست مهمه ، مثلا در بانک اطلاعاتی مقایسه متنی با مقایسه عددی تفاوت چشمگیری داره ، برای همین اون روش رو توصیه کردم :) (12 سال پیش)
0 0
والا تنها مجوزی که اضافه کردم همین نوشتن روی کارت حافظه است غیر این مجوزی نگرفتم.حتی بعد اینکه یه بار برنامه رو روی گوشی نصب کردم دیدم تو کارت حافظه پوشه موردنظر ساخته شده و بانک هم تو همون پوشه قرار گرفته ولی نمیدونم کجای کار میلنگه !!! داداش بازم تشکر میکنم از وقتی که گذاشتی... (12 سال پیش)
0 0
خواهش می کنم ، برسی لاگ ها و آموزش خطایابی حتما کمکتون میکنه :) (12 سال پیش)
0 0
هیچ وقت اتکا به یه رشته اونم از نوع فارسی به عنوان کلید تو کوئری گرفتن صحیح نبوده. پیشنهاد میکنم روش مجتبی رو انجام بدی (12 سال پیش)
0 0
مهندس حسین زاده عزیز از شمام تشکر میکنم که وقت گذاشتید... (12 سال پیش)

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