بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

تغذیه ی یک لیست ویو کاستوم از دیتابیس (حل شده)

مدیریت گفتگو
amir Alu 11 سال پیش
آخرین تغییر: 11 سال پیش

با سلام دوستان من یک دیتابیس ساختم که 2تا جدول داره و به خوبی هم داره کار میکنه و اون رو بر اساس اموزش بخش 14 ساختم ولی حالا میخوام اطلاعات داخل یک لیست ویو نمایش داده بشه و واسه این کار هم از بخش 10 استفاده کردم و این هم جواب داده اما مشکل داره. مشکل اینجاست که هر بار اطلاعاتی به دیتابیس فرستاده میشه داخل لیست ویو چند برابر نشون داده میشه. اول 2 بار بعد 5 بعد 10 و...

ولی توی دیتابیس اطلاعات صحیح است اما داخل لیست ویو تکرا میشه. بنظر شما مشکل از کجا میتونه باشه (میدونم باید حتما کد بزارم تا بتونین نظر بدید ولی خوب صفحه اکتیویتی شده حدود 400 خط کد و نمیدونم کجاش بزارم)

اگر بتونین من را راهنمایی کنین ممنون میشم یا حداقل یک پروژه سمپل مثل این نشونم بدید

قسمت tazesazi کدم را براتون میزارم. خودم حس میکنم شاید این ایرادی داره...

 private void tazesazi(){
lstContent = (ListView) findViewById(R.id.lstContent);
adapter = new AdapterData(G.data);
lstContent.setAdapter(adapter);

Cursor cursor=G.database.rawQuery("SELECT * FROM gharz_dadan WHERE _id>0",null);
while (cursor.moveToNext()){
String txt1=cursor.getString(cursor.getColumnIndex("tarikh1"));
String txt2=cursor.getString(cursor.getColumnIndex("kala"));
String txt3=cursor.getString(cursor.getColumnIndex("shakhs"));
String txt4=cursor.getString(cursor.getColumnIndex("tarikh2"));
String txt5=cursor.getString(cursor.getColumnIndex("desc"));

StructData structData =new StructData();
structData.date1=txt1;
structData.kala=txt2;
structData.shakhs=txt3;
structData.date2=txt4;
structData.desc=txt5;

G.data.add(structData);
}
cursor.close();
adapter.notifyDataSetChanged();
}

نظرات

hosseinAmini 11 سال پیش
در متد tazesazi بعد از قبل از ساختcursor بنویسید adapter.clear و در متد onResume متد tazesazi رو دوباره صدا بزنید
amir Alu 11 سال پیش
ممنون دوست من ، الان مشکل چند برابر شدن اطلاعات برطرف شد اما یک مشکل دیگه بوجود آمد. اونم این که تمام item ها در لیست ویو یک مقدار را نشان میدهد و اون هم اخرین مقداری هست که به دیتابیس وارد میشود
amir Alu 11 سال پیش
اگر قسمت دیگه ای از کد نیاز هست بگین تا داخل سوال قرار بدم. فقط خواهش میکنم راهنمایی کنید
hosseinAmini 11 سال پیش
این قسمت از کد که مشکلی نداره. تمام کدهای مربوط به ListView رو بزارید تا ببینم متوجه اشکال کار میشم یا نه
hamcalas 11 سال پیش
من هم این مشکل را دارم ،

پاسخ‌ها 4

amir Alu 11 سال پیش

کلاس G

 public class G extends Application {
public static Context context;
public static LayoutInflater inflater;
public static Activity currentActivity;
public static ArrayList<StructData> data = new ArrayList<StructData>();
public static SQLiteDatabase database;
public static final String DIR_SDCARD=Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE=DIR_SDCARD+"/db-test/";

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
context=this.getApplicationContext();
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
database=this.openOrCreateDatabase(DIR_DATABASE+"/test", MODE_PRIVATE, null);

database.execSQL("CREATE TABLE IF NOT EXISTS gharz_dadan (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE " +
", tarikh_gharz_dadan TEXT" +
", kala TEXT" +
", shakhs TEXT" +
", tarikh_pas_gereftan TEXT" +
", desc TEXT)");
database.execSQL("CREATE TABLE IF NOT EXISTS gharz_gereftan (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE " +
", tarikh_gharz_gereftan TEXT" +
", kala TEXT" +
", shakhs TEXT" +
", tarikh_pas_dadan TEXT" +
", desc TEXT)");
}

}

کلاس StructData

 public class StructData {

public String shakhs;
public String kala;
public String desc;
public String date_gharzdadan;
public String date_pasgereftan;
public String date_gharzgereftan;
public String date_pasdadan;

public boolean done;
}

کلاس AdapterData

 public class AdapterData extends ArrayAdapter<StructData> {

public AdapterData(ArrayList<StructData> array) {
super(G.context, R.layout.list_layout, array);
}


private static class ViewHolder {

public ViewGroup layoutRoot;
public TextView txtshakhs;
public TextView txtkala;
public TextView txtdesc;
public TextView txtgharzdadan;
public TextView txtpasgereftan;



public ViewHolder(View view) {
txtshakhs = (TextView) view.findViewById(R.id.txt1);
txtkala = (TextView) view.findViewById(R.id.txt2);
txtgharzdadan = (TextView) view.findViewById(R.id.txt3);
txtpasgereftan = (TextView) view.findViewById(R.id.txt4);
txtdesc = (TextView) view.findViewById(R.id.txt5);
}


public void fill(final ArrayAdapter<StructData> adapter, final StructData item, final int position) {
txtshakhs.setText(item.shakhs);
txtkala.setText(item.kala);
txtgharzdadan.setText(item.date_gharzdadan);
txtpasgereftan.setText(item.date_pasgereftan);
txtdesc.setText(item.desc);



}
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;

StructData item = getItem(position);
if (convertView == null) {
convertView = G.inflater.inflate(R.layout.list_layout, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.fill(this, item, position);
return convertView;
}
}

 

نظرات

احسان منصوری 11 سال پیش

کلاس های Adapter و کلاس G مشکلی ندارن. مشکل از اون متد Tazasazi هست. به این شکل اصلاحش کنید:

 @Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cpu);

    ListView lstContent = (ListView) findViewById(R.id.lstContent);
    adapter = new AdapterData(G.data);
    lstContent.setAdapter(adapter);
    tazasazi();
}

private void tazasazi() {
    G.data.clear();
    Cursor cursor = G.database.rawQuery("SELECT * FROM gharz_dadan WHERE id>0", null);
    while (cursor.moveToNext()) {
        StructData structData= new StructData();
        structData.date1 = cursor.getString(cursor.getColumnIndex("tarikh1"));
        structData.kala = cursor.getString(cursor.getColumnIndex("kala"));
        structData.shakhs = cursor.getString(cursor.getColumnIndex("shakhs"));
        structData.date2 = cursor.getString(cursor.getColumnIndex("tarikh2"));
        structData.desc = cursor.getString(cursor.getColumnIndex("desc"));

        G.data.add(data);

    }
    cursor.close();
    adapter.notifyDataSetChanged();

}

نظرات

amir Alu 11 سال پیش
خیلی ممنونم از راهنمایی شما اما متاسفانه مشکل سر جای خودش است
hosseinAmini 11 سال پیش

من با کدهای شما یک لیست ویو درست که متوجه دوتا اشتباه شدم:

  1. برای ایجاد دیتابیس درقسمتی که نام دیتابیس رو وارد می کنید، باید پسوند sqlite رو هم بنویسید، به این شکل
     database=this.openOrCreateDatabase(DIR_DATABASE+"/test.sqlite", MODE_PRIVATE, null);
  2. در متد tazesazi  از date1 و date2 استفاده کرده بودید ولی توی کلاس StructData این فیلدها رو تعریف نکردید

دانلود پروژه 

دانلود دیتابیس

فقط در خط زیر نمیدونم کار برد MODE_PRIVATE چیه. اگه ممکنه توضیح بدید تا منم یاد بگیرم :)

 database=this.openOrCreateDatabase(DIR_DATABASE+"/test", MODE_PRIVATE,null);

نظرات

amir Alu 11 سال پیش
خیلی ممنونم از جواب کامل شما. بررسی میکنم ببینم داخل پروژه من هم کار میکنه. در مورد قسمتی که گفتید/ (در متد tazesazi از date1 و date2 استفاده کرده بودید ولی توی کلاس StructData این فیلدها رو تعریف نکردید) باید بگم متاسفانه بی دقتی من در پرسش سوال باعث این موضوع شد. من توی برنامم اسم را تغییر داده بودم ولی یادم رفت اینجا اصلاح کنم . درباره MODE_PRIVATE من داخل استک سوال کردم که واسه گوشی های قدیمی و گوشی هایی که مموری ندارن چطور کد بنویسم که کرش نکنه و گفتن از این استفاده کن
amir Alu 11 سال پیش
مشکل تکرار حل شد. و الان دقیقا همون تعداد ایتمی که در دیتابیس هست داخل لیست ویو نمایش داده میشه. ولی مشکل این که تمام خانه های لیست ویو فقط اخرین اطلاعاتی که به دیتابیس وارد میشود را نمایش میدهند هنوز پا بر جاست
hosseinAmini 11 سال پیش
ولی من چنین مشکلی ندارم. شما پروژه ای رو که برای دانلود گذاشتم رو امتان کردید؟ اونم مشکل داشت؟
amir Alu 11 سال پیش
اره وقتی دیتابهش وارد میشه در هنگام اجرای برنامه مشکل داره. من خودم احساس میکنم داخل while باید یه تغییری داده بشه. الان یه تیکه کد دیگه میزارم ببینید
amir Alu 11 سال پیش

داخل صفحه یک دکمه هست که وقتی روش کلیک میشه کد زیر اجرا میشه

String string1=edt1.getText().toString();
String string2=edt2.getText().toString();
String string3=edt3.getText().toString();
String string4=edt4.getText().toString();
String string5=edt5.getText().toString();

G.database.execSQL("INSERT INTO gharz_dadan (tarikh_gharz_dadan,kala,shakhs,tarikh_pas_gereftan,desc)" +
" VALUES ('"+string1+"','"+string2+"','"+string3+"','"+string4+"','"+string5+"')");

tazesazi();

هر بار که روی دکمه کلیک میشه اطلاعاتی وارد دیتابیس میشه و داخل دیتابیس صحیح است اما خروجی دیتابیس اخرین ورودی میباشد

نظرات

hosseinAmini 11 سال پیش
اینم لینک برنامه همراه با دکمه اضافه کردن. سورسش رو ببینید و با سورس خودتون مقایسه کنید تا متوجه شید کجاش اشتباس لینک
amir Alu 11 سال پیش
ممنونم دوست من، حتما تست میکنم و اگر جواب گرفتم اطلاع میدم. متاسفانه امروز عصر بستری شدم و الان با اقتدار تمام از بیمارستان پیام میدم. امیدوارم سریعتر به لبتابم دسترسی پیدا کنم تا تستس کنم اخه خیلی فکرم درگیر کرده
amir Alu 11 سال پیش
مشکل من برطرف شد. واقعا از شما ممنونم که به من کمک کردید
hamcalas 11 سال پیش
اگه بخوای هم اطلاعات قبلی دیتابیس و هم جدید را نشون بده باید کجاشو تغییر بدی؟
amir Alu 11 سال پیش
همین کدی که وجود داره هم قبلی را نشون میده هم جدید رو و نیاز به کد دیگه ای نیست
Soroush 11 سال پیش
اگر ممکنه لینک رو آپلود کنید ، لینک خراب هست
alireza71 11 سال پیش
بله لینک خراب هست اگر ممکنه اصلاح کنید d:

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