تغذیه ی یک لیست ویو کاستوم از دیتابیس (حل شده)
با سلام دوستان من یک دیتابیس ساختم که 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();
}






کلاس 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;
}
}

کلاس های 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(); }

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

داخل صفحه یک دکمه هست که وقتی روش کلیک میشه کد زیر اجرا میشه
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();
هر بار که روی دکمه کلیک میشه اطلاعاتی وارد دیتابیس میشه و داخل دیتابیس صحیح است اما خروجی دیتابیس اخرین ورودی میباشد
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .