PDA

View Full Version : خطا در ارسال دیتا از یک اکتیویتی به اکتیویتی دیگر ؟



ghasem110deh
چهارشنبه 08 دی 1395, 21:28 عصر
سلام به همه :-)
دوستان من با کلیک روی آیتم های لیست ویو ، id آیتم مورد نظر رو میگیرم :


@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Clicked item id", " "+ id);
// Intent intent = new Intent(getBaseContext(), UpdateActivity.class);
// intent.putExtra("EXTRA_ID", id);
// startActivity(intent);
return true;
}

توی لاگ مشخصه (عکس ضمیمه)

اما وقتی ارسال میکنم به اکتیویتی بعد برنامه بسته میشه !
اینم کدای اکتیویتی دوم که مقدار رو میریزم توی یه متغیر استرینگ :


STR_ID = getIntent().getStringExtra("EXTRA_ID");
TXT_VIEW.setText(STR_ID);

در واقع آیدی رو واسه ویرایش و حذف میخوام !

ghasem110deh
چهارشنبه 08 دی 1395, 21:49 عصر
چرا به دیتابیس گیر میده !؟
من فقط آیدی رو دارم میفرستم به اکتیویتی بعد :


LIST_USER.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Clicked item id", " "+ id);
Intent intent = new Intent(getBaseContext(), UpdateActivity.class);
intent.putExtra("EXTRA_ID", id);
startActivity(intent);
return true;
}
});

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


package ir.rahgoshafan.attachsqlitedatabase;

import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import ir.rahgoshafan.attachsqlitedatabase.database.Datab aseHelper;

public class UpdateActivity extends AppCompatActivity {
private DatabaseHelper DB_HELPER;

private TextView TXT_VIEW;
private EditText EDT_NAME;
private EditText EDT_AGE;
private EditText EDT_GENDER;
private EditText EDT_PASS;
private EditText EDT_DESC;
private EditText EDT_PIC;
private Button BTN_UPDATE;
private Button BTN_DELETE;
private String STR_ID;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);

TXT_VIEW = (TextView) findViewById(R.id.textView);
EDT_NAME = (EditText) findViewById(R.id.editText);
EDT_AGE = (EditText) findViewById(R.id.editText2);
EDT_GENDER = (EditText) findViewById(R.id.editText3);
EDT_PASS = (EditText) findViewById(R.id.editText4);
EDT_DESC = (EditText) findViewById(R.id.editText5);
EDT_PIC = (EditText) findViewById(R.id.editText6);
BTN_UPDATE = (Button) findViewById(R.id.button) ;
BTN_DELETE = (Button) findViewById(R.id.button2);

DB_HELPER = new DatabaseHelper(this);

STR_ID = getIntent().getStringExtra("EXTRA_ID");
TXT_VIEW.setText(STR_ID);

BTN_UPDATE.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
boolean isInserted = DB_HELPER.updateUser(Integer.parseInt(STR_ID), EDT_NAME.getText().toString(), Integer.parseInt(EDT_AGE.getText().toString()),
Integer.parseInt(EDT_GENDER.getText().toString()), Integer.parseInt(EDT_PASS.getText().toString()),
EDT_DESC.getText().toString(), EDT_PIC.getText().toString());
if (isInserted == true)
// finish method use to close this activity and back to main activity
finish();
else
Snackbar.make(view, "خطا در ورایش مشخصات کاربر!", Snackbar.LENGTH_LONG).setAction("Action", null).show();
} catch(Exception e){
e.printStackTrace();
return;
}
}
});

BTN_DELETE.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
boolean isInserted = DB_HELPER.deleteUser(Integer.parseInt(STR_ID));
if (isInserted == true)
// finish method use to close this activity and back to main activity
finish();
else
Snackbar.make(view, "خطا در حذف کاربر!", Snackbar.LENGTH_LONG).setAction("Action", null).show();
} catch(Exception e){
e.printStackTrace();
return;
}
}
});
}
}

ژیار رحیمی
پنج شنبه 09 دی 1395, 00:59 صبح
سلام به همه :-)
دوستان من با کلیک روی آیتم های لیست ویو ، id آیتم مورد نظر رو میگیرم :


@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Clicked item id", " "+ id);
// Intent intent = new Intent(getBaseContext(), UpdateActivity.class);
// intent.putExtra("EXTRA_ID", id);
// startActivity(intent);
return true;
}

توی لاگ مشخصه (عکس ضمیمه)

اما وقتی ارسال میکنم به اکتیویتی بعد برنامه بسته میشه !
اینم کدای اکتیویتی دوم که مقدار رو میریزم توی یه متغیر استرینگ :


STR_ID = getIntent().getStringExtra("EXTRA_ID");
TXT_VIEW.setText(STR_ID);

در واقع آیدی رو واسه ویرایش و حذف میخوام !

id از نوع long هست به اکتیویتی دوم که پاس میشود باید بصورت long خوانده شود.

Bundle extra=getIntent().getExtras();
if(extra!=null){
long Id = extra.getLong("EXTRA_ID");
TXT_VIEW.setText("" + id);
}

ghasem110deh
پنج شنبه 09 دی 1395, 11:45 صبح
آقای رحیمی تشکر :-)
کاش سوال رو کامل میپرسیدم !!!

حالا چطور بقیه اطلاعات کاربر رو بفرستم به اکتیویتی ویرایش ؟
اینطوری رفتم جلو ولی برنامه بسته میشه :


User user = (User) parent.getItemAtPosition(1);
Log.i("Clicked item text : ", String.valueOf(position));

یوزر ، کلاس یوزر هست (جدول یوزر) که حاوی فیلدهای یوزر هست ؟ (من توی جدول 8 تا فیلد دارم که فقط 4 تاش رو توی لیست ویو نمایش دادم)
و یه سوال دیگه اینکه الان دارم آدرس عکس (از توی گالری گوشی) توی دیتابیس ذخیره میکنم ، چطور توی imageView نمایش بدم ؟

تشکر :-)
(سیستم عامل اندروید خیلی مزخرفه :لبخند: )

ghasem110deh
پنج شنبه 09 دی 1395, 14:01 عصر
و سوال دیگه :
میخوام اطلاعات کاربر رو با توجه به آیدی ش از دیتابیس بخونم و توی تکست ویو نشون بدم !
البته آخرین فیلد جدول ادرس عکس هست (که از گالری انتخاب شده) و بعد با توجه به اون آدرس عکس توی imageView نمایش داده بشه

این کد واسه خوندن اطلاعات با توجه به آیدی :


public Cursor selectUser(int id) {
openDatabase();
db.beginTransaction();
try {
Cursor cursor = db.rawQuery("SELECT * FROM tblUser WHERE id =" + id, null);
db.setTransactionSuccessful();
cursor.moveToFirst();
return cursor;
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, "Delete Error");
return null;
} finally {
db.endTransaction();
closeDatabase();
}
}

اینم کد مربوط به اکتیویت که میخوام نام کاربر و عکس ش (آدرس عکس توی گالری) نمایش بدم :

private void loadUserInfo() {
try {
Cursor cursor = DB_HELPER.selectUser(Integer.parseInt(String.value Of(LNG_ID)));
if (cursor.moveToFirst()) {
File imgFile = new File(cursor.getString(6));
if (imgFile.exists()) {
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath() );
IMG_USER.setImageBitmap(myBitmap);
}
TXT_USERINFO.setText(cursor.getString(6));
}
} catch (Exception e) {
Log.i("Error", e.toString());
return;
} }

منتها این خطا رو میده :


I/Clicked*item*id*:: 4
I/Error: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor ir.rahgoshafan.attachsqlitedatabase.database.Datab aseHelper.selectUser(int)' on a null object reference
I/Choreographer: Skipped 57 frames! The application may be doing too much work on its main thread.

ژیار رحیمی
پنج شنبه 09 دی 1395, 14:05 عصر
شما Id کاربر رو به Activity ویرایش پاس میکنی در Activity ویرایش میتونی بر اساس Id روی جدول Users از دیتابیس Select بزنی یا روش دیگر همانند پاس کردن Id بقیه property های User رو به Activity ویراش پاس بدی .(به نظر من روش اول مناسب تر هست).

private ImageView ImgView;
ImgView = (ImageView) findViewById(R.id.imageView);
ImgView.setImageBitmap(BitmapFactory.decodeFile("pathOfImageFile"));

ژیار رحیمی
پنج شنبه 09 دی 1395, 14:15 عصر
خب مشخصه اشاره گر cursor دارای مقدار null هست شما مقدارId رو Log کنید.و حتما بعد از Select مقدار cursor رو چک کنید که null نباشد.نوع تبدیل به Integer رو هم بصورت زیر بنوسید ببین مشکل حل می شود.

Integer.parseInt(LNG_ID.getText().toString());

ghasem110deh
پنج شنبه 09 دی 1395, 15:59 عصر
آیدی رو بدون مشکل میگیره ! توی تکست ویو و هم توی لاگ نمایش میده !
کدهای مربوط به خوندن سطر به نظرم مشکل دشته باشه !!؟؟ ظاهرا کدای توی کلاس دیتابیس هم که درستن

:متفکر:

ghasem110deh
پنج شنبه 09 دی 1395, 18:03 عصر
آقای رحیمی اون مشکل هم رفع ... حالا مشکل بعدی :قهقهه:
الان میخوام بجز آیدی مقادیر دیگه هم بفرستم به اکتیویتی دوم !

Log.i("item Text ", parent.getItemAtPosition(1).toString());

منتها خروجی اینه !!


I/Clicked item id: 23
I/item Text: ir.rahgoshafan.attachsqlitedatabase.model.UserInfo @14f4b78

Nevercom
جمعه 10 دی 1395, 00:01 صبح
کلاسی که بعنوان مدل ساختید رو به شکلی غییر بدید که اینترفیس Parcelable رو implement کنه. با اینکار میتونید کل آبجکت رو در اینتنت ارسال کنید (putParcelableExtra)

برای راحتی کار پلاگین های موجود برای تولید اتوماتیک کدهای Parcelable برای کلاستون رو نصب کنید، از بخش پلاگین های اندروید استودیو جستجو و نصب کنید

ghasem110deh
جمعه 10 دی 1395, 14:23 عصر
کلاسی که بعنوان مدل ساختید رو به شکلی غییر بدید که اینترفیس Parcelable رو implement کنه.

الان مشکلم توی گرفتم مقادیر از لیست ویو هست ... آیدی رو میگیره ولی بقیه رو نه !!؟