بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
سوال در مورد دیتابیس داخلی (حل شد)
سلام دوستان :
من اینجا از دیتابیس sqlite اطلاعات رو می خونم.
حالا می خوام وقتی در لیست ویو روی یک ایتم که کلیک می کنم ان ایتم از دیتابیس حذف بشه .
چطور این عمل انجام میشه؟
من با این کد انجام میدم ولی حذف نمیشه از دیتابیس :(
البته اگر دو تا اطلاعات در دیتابیس باشه دومی پاک میشه. ایدی دیتابیس با ایدی لیست ویو هماهنگ نیست.
cb = new DataBaseConnection(getActivity(), "Peygham", 5);
listP = (ListView) rootView.findViewById(R.id.listP);
adapter = new AdapterMessageF(G.messageF);
listP.setAdapter(adapter);
localPeyghamRead();
adapter.notifyDataSetChanged();
listP.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(getActivity().getApplicationContext(),
"Long Clicked : ", Toast.LENGTH_LONG).show();
remove(id);
G.messageF.remove(position);
adapter.notifyDataSetChanged();
adapter.notifyDataSetInvalidated();
return false;
}
});
return rootView;
}
public void remove(long id) {
String string = String.valueOf(id);
SQLiteDatabase database = cb.getWritableDatabase();
database.execSQL("DELETE FROM peygham WHERE id = '" + string + "'");
database.close();
}
private void localPeyghamRead() {
SQLiteDatabase database = cb.getReadableDatabase();
G.messageF.clear();
Cursor cursor = database.rawQuery("SELECT * FROM peygham", null);
while (cursor.moveToNext()) {
try {
StructMessageF lTask = new StructMessageF();
lTask.title = cursor.getString(cursor.getColumnIndex("title"));
lTask.alert = cursor.getString(cursor.getColumnIndex("alert"));
lTask.date = cursor.getString(cursor.getColumnIndex("date"));
G.messageF.add(lTask);
} catch (Exception e) {
}
}
cursor.close();
database.close();
}
0
0
با Log ببینید شماره position آیتم ها در لیست ویو با id دیتابیس یکی هست یا نه مثلا وقتی روی آیتم کلیک شد مقدار position و id توی Logcat نمایش داده بشه (10 سال پیش)
0
0
صفر هستش. و ایدی دیتابیس یک . برای همین پاک نمیشه (10 سال پیش)
0
0
اگه position رو به جای id به متد remove بدی حل نمیشه ؟ (10 سال پیش)
0
0
دادم نشد. باید ایدی دیتابیس با ایدی لیست ویو یکی باشه یا بفهمه این اطلاعات برای ایتم لیست ویو هستش (10 سال پیش)
0
0
تو دیتابیس کاری نمیشه کرد که از صفر شروع بشه؟ (10 سال پیش)
0
0
توی Long click اون toast رو بهت نشون میده؟ return false اونجا چه کار میکنه؟ (10 سال پیش)
0
0
نه فکر نکنم همیشه از یک شروع میشه. (10 سال پیش)
0
0
من مشکلم toast نیست که . اونو گذاشتم که وقتی کلیک میشه بگه کلیک شد ! اگر میدونید چه راهی هست که تشخیص بده اطلاعات دیتابیس با ایتم لیست ویو یکی هست و بشه از رو ایدیشون پاک کرد رو راهنمایی کنید!!ممنون (10 سال پیش)
0
0
استاد آقاجانی توی بخش 12 که روی پروژه Note کار میکرد چطوری Delete رو پیاده سازی کرد؟ (10 سال پیش)
0
0
می تونیم این حرکتو بزنیم؟ وقتی کلید شد id=position+1 بشه ولی فکر کنم یه مشکلاتی هم داره! امتحان کن آقا علی! (10 سال پیش)
0
0
شما باید تو دیتابیس یه فیلد داشته باشید که مقدارش برای هر ردیف یکتا (غیر تکراری) باشه، معمولا یه فیلد id قرار میدن بصورت auto increment تا مشکلی از این بابت نباشه. الان اگه title ی (یا سایر فیلدها) که دارین این شرایط رو داشته باشه میشه از اون استفاده کرد. (البته راه درست و اصولی همون id هست) (10 سال پیش)
0
0
خوب من ایدی دارم از دیتابیس ولی هماهنگ نیست با ایتم های لیست ویو. مثلا اگر دفعه اول اطلاعات بیاد در دیتابیس و داخل لیست ویو نشون بده . ایدی دیتابیس 1 هستش و ایدی لیست ویو 0 . برای همین پاک نمیکنه (10 سال پیش)
+1
0
خب پس الان زمان پر کردن آرایه آیدی رو هم بکشید بیرون (مثلا lTask.id) بعد تو متد getItemId داخل آداپتر رو override کنید، اونجا این آیدی رو برگردونید، اون موقع تو متد onItemLongClick اون متغیر id همن id آیتم شما در دیتابیس خواهد بود، اگر متوجه نشدید بگید. (10 سال پیش)
0
0
زیاد نگرفتم محتوا رو اگه امکانش هست با کد توضیح بدید ممنون میشم ! (10 سال پیش)
برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال
Spirit
10 سال پیش
+2
0
مرحله اول
StructMessageF lTask = new StructMessageF();
// get id from db
lTask.id = cursor.getString(cursor.getColumnIndex("id"));
lTask.title = cursor.getString(cursor.getColumnIndex("title"));
lTask.alert = cursor.getString(cursor.getColumnIndex("alert"));
lTask.date = cursor.getString(cursor.getColumnIndex("date"));
G.messageF.add(lTask);
مرحله دوم (در Adapter)
public class AdapterMessageF extends BaseAdapter {
private List<StructMessageF> list;
public AdapterMessageF(List<StructMessageF> list) {
this.list = list;
.
.
.
}
@Override
public View getView(final int pos, View v, ViewGroup parent) {
.
.
.
}
@Overrideالا
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
// برگشت دادن آی دی آیتم ( همون آیدی موجود در دیتابیس)
@Override
public long getItemId(int position) {
return list.get(position).id;
}
}
با توجه به این تغییرات متد onItemLongClick که بالا قرار دادید باید به جواب بده.
من این مثالی که اینجا زده رو هم امتحان کردم ولی نشد . لینک (10 سال پیش)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .