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

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

amir Alu  10 سال پیش  9 سال پیش
+6 0

با سلام دوستان من یک دیتابیس ساختم که 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();
}
+3 0
در متد tazesazi بعد از قبل از ساختcursor بنویسید adapter.clear و در متد onResume متد tazesazi رو دوباره صدا بزنید (10 سال پیش)
+3 0
ممنون دوست من ، الان مشکل چند برابر شدن اطلاعات برطرف شد اما یک مشکل دیگه بوجود آمد. اونم این که تمام item ها در لیست ویو یک مقدار را نشان میدهد و اون هم اخرین مقداری هست که به دیتابیس وارد میشود (10 سال پیش)
+3 0
اگر قسمت دیگه ای از کد نیاز هست بگین تا داخل سوال قرار بدم. فقط خواهش میکنم راهنمایی کنید (10 سال پیش)
+1 0
این قسمت از کد که مشکلی نداره. تمام کدهای مربوط به ListView رو بزارید تا ببینم متوجه اشکال کار میشم یا نه (10 سال پیش)
0 0
من هم این مشکل را دارم ، (10 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
amir Alu  10 سال پیش
0 0

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

 

پاسخ به سوال 
احسان منصوری  10 سال پیش
+2 0

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

}
0 0
خیلی ممنونم از راهنمایی شما اما متاسفانه مشکل سر جای خودش است (10 سال پیش)
پاسخ به سوال 
hosseinAmini  10 سال پیش
+3 0

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

  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);
+2 0
خیلی ممنونم از جواب کامل شما. بررسی میکنم ببینم داخل پروژه من هم کار میکنه. در مورد قسمتی که گفتید/ (در متد tazesazi از date1 و date2 استفاده کرده بودید ولی توی کلاس StructData این فیلدها رو تعریف نکردید) باید بگم متاسفانه بی دقتی من در پرسش سوال باعث این موضوع شد. من توی برنامم اسم را تغییر داده بودم ولی یادم رفت اینجا اصلاح کنم . درباره MODE_PRIVATE من داخل استک سوال کردم که واسه گوشی های قدیمی و گوشی هایی که مموری ندارن چطور کد بنویسم که کرش نکنه و گفتن از این استفاده کن (10 سال پیش)
0 0
مشکل تکرار حل شد. و الان دقیقا همون تعداد ایتمی که در دیتابیس هست داخل لیست ویو نمایش داده میشه. ولی مشکل این که تمام خانه های لیست ویو فقط اخرین اطلاعاتی که به دیتابیس وارد میشود را نمایش میدهند هنوز پا بر جاست (10 سال پیش)
+1 0
ولی من چنین مشکلی ندارم. شما پروژه ای رو که برای دانلود گذاشتم رو امتان کردید؟ اونم مشکل داشت؟ (10 سال پیش)
0 0
اره وقتی دیتابهش وارد میشه در هنگام اجرای برنامه مشکل داره. من خودم احساس میکنم داخل while باید یه تغییری داده بشه. الان یه تیکه کد دیگه میزارم ببینید (10 سال پیش)
پاسخ به سوال 
amir Alu  10 سال پیش
0 0

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

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();

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

+1 0
اینم لینک برنامه همراه با دکمه اضافه کردن. سورسش رو ببینید و با سورس خودتون مقایسه کنید تا متوجه شید کجاش اشتباس لینک (10 سال پیش)
+1 0
ممنونم دوست من، حتما تست میکنم و اگر جواب گرفتم اطلاع میدم. متاسفانه امروز عصر بستری شدم و الان با اقتدار تمام از بیمارستان پیام میدم. امیدوارم سریعتر به لبتابم دسترسی پیدا کنم تا تستس کنم اخه خیلی فکرم درگیر کرده (10 سال پیش)
0 0
مشکل من برطرف شد. واقعا از شما ممنونم که به من کمک کردید (10 سال پیش)
0 0
اگه بخوای هم اطلاعات قبلی دیتابیس و هم جدید را نشون بده باید کجاشو تغییر بدی؟ (10 سال پیش)
0 0
همین کدی که وجود داره هم قبلی را نشون میده هم جدید رو و نیاز به کد دیگه ای نیست (10 سال پیش)
+1 0
اگر ممکنه لینک رو آپلود کنید ، لینک خراب هست (10 سال پیش)
0 0
بله لینک خراب هست اگر ممکنه اصلاح کنید d: (9 سال پیش)

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