ورود

View Full Version : مشکل جستجو در دیتابیس



zarabela
دوشنبه 12 مرداد 1394, 10:51 صبح
سلام
من برای جستجو از کد زیر استفاده کردم
final EditText et=(EditText)findViewById(R.id.eDitText1);
et.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
db.findBeyt(et.getText().toString(),tbl_beyt);
tazeSazi();
}
});


public void tazeSazi() {
ArrayAdapter<Beyt> adapter;
adapter=new ArrayAdapter<Beyt>(this,
android.R.layout.simple_list_item_1, beyTha);
setListAdapter(adapter);
}


findBeyt:
public List<Beyt> findBeyt(String beyt,String tabale) throws SQLException
{
Cursor cursor =

db.query(true, tabale, new String[] {KEY_ROWID,
KEY_BEYT}, KEY_BEYT + " LIKE '%" + beyt + "%'", null,
null, null, null, null);
List<Beyt> beytha = cursorToList(cursor);
return beytha;
}

ولی وقتی داخل editText چیزی تایپ میکنم این ارور رو میده:
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.data/databases/laki

مشکل کار چیه؟

alireza142
دوشنبه 12 مرداد 1394, 11:03 صبح
شما باید قبل از هر ارجاع به کلاس DatabaseHandler ، اون رو باز کنید و بعد ببندینش.
یعنی متد db.open(); رو قبلش و متد db.close(); رو بعدش قرار دهید.
در ضمن ارجاعی که به کلاس DatabaseHandler زدید، اگه مقداری رو بر می گردونه، در جایی ذخیره نمیشه که...!!

zarabela
دوشنبه 12 مرداد 1394, 11:13 صبح
شما باید قبل از هر ارجاع به کلاس DatabaseHandler ، اون رو باز کنید و بعد ببندینش.
یعنی متد db.open(); رو قبلش و متد db.close(); رو بعدش قرار دهید.
در ضمن ارجاعی که به کلاس DatabaseHandler زدید، اگه مقداری رو بر می گردونه، در جایی ذخیره نمیشه که...!!

یعنی به این صورت؟
final EditText et=(EditText)findViewById(R.id.eDitText1);
et.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
db.open();
db.findBeyt(et.getText().toString(),tbl_beyt);
tazeSazi();
db.close();
}
});
الان این ارور رو میده:
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): java.lang.NullPointerException

alireza142
دوشنبه 12 مرداد 1394, 11:36 صبح
آره . اما فکر کنم هنوز در دریافت اطلاعات از دیتابیس ایراد داره.


اینا رو امتحان کنید :. البته قبلش یک لیست به عنوان متغییر مرجع اعلام کنید(mySearchList)


String [] mySearchList;
.
.
.
final EditText et=(EditText)findViewById(R.id.eDitText1);
et.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}


@Override
public void afterTextChanged(Editable s) {

String KeyWord = et.getText().toString().trim();

db.open();
mySearchList = db.getListSearch(KeyWord);
db.close();

tazeSazi();

}
});



و کد های متد getListSearch در کلاس DatabaseHandler :


public String[] getListSearch(String keyWord ) {

String[] list;

Cursor c = mydb.rawQuery("select * from " + TableName + " where " + YourField
+ " LIKE '%" + keyWord + "%'" , null);

list = new String[c.getCount()];
if (c.getCount() > 0) {
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
list[i] = c.getString(c.getColumnIndex(YourField2)).toString ();
c.moveToNext();
}
}

c.close();
return list;
}


TableName : نام جدولتون هست. نامش رو خودتون باید بنویسید.
YourField : ستونی که در آن همین عبارت
YourField2 : اسم ستونی که می خواین در لیست برگرده. مثلا میتونه آی دی باشه یا هر اسمی که دوست دارید.

حالا در همون متد tazeSazi ، از این لیست (mySearchList) استفاده کنید. مثلا پاسش بدید به لیست ویو.