PDA

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



hadihs
شنبه 31 مرداد 1394, 23:18 عصر
سلام

با جزئیات همش رو توضیح دادم لطفا ببینید چی کار کنم.از همگی ممنونم به خاطر وقتی که میذارند.

من برای ساخت دیتابیس از sqlite expert استفاده میکنم.(دقت کنید که من دیتابیسم رو اول در محیط sqlite expert ساهتم و بعد دارم در اندروید با کد نویسی استفاده میکنم)
اول دیتابیسم رو ساختم و بعد با استفاده از کلاسی به نام database اون رو در مسیر گوشی گفتم کپی کنه تا بتونم حین اجرای برنامه از اون استفاده کنم.
وقتی می خوام از اطلاعات دیتابیسم استفده کنم اول در اکتیویتی Main متدی را از کلاس database ای که ساخته بودم فراخوانی میکنم تا دیتابیس رو در گوشی کپی کنه.
سپس میگم که وقتی روی فلان دکمه کلیک شد بره به اکتیویتی بعدی. وقتی به اکتیویتی بعدی میرم میخوام یه id رو در دیتابیس پیدا کنه و سطر اون رو انتخاب کنه.(در سطر اون مثلا اسم هست و فصل) بعد میخوام با استفاده از متدی که در دیتابیس نوشتم و اون رو اینجا فراخوانی میکنم id رو بگیره و مثلا اسم رو برگردونه. برای همین از این متد اسفاده میکنم:



public String display_address(int id){
Cursor cu = mydb.rawQuery("select * from database where id="+id, null);
String s=cu.getString(1);
return s;
}



String s=cu.getString(2);
در این سطر بالا از کل کد های بالا بهش گفتم که اطلاعات اون سطر رو که در ستون دوم قرار داره در برداره.

در اکتیویتی اول یک شی از روی کلاس database ساختم و اسمش رو db گذاشتم سپس این متد را فراخوانی میکنم و id رو در پرانتز مینویسم.مثلا:



db.open();
db.display_address(5);
db.close();






پس حالا به جایی از دیتابیس میره که id اونجا 5 باشه و بعد محتوای ستون دوم اون سطر برمیگردونه.
برای دو متد open و close از این کد ها استفاده کردم.
برای open:


SQLiteDatabase mydb ;






public void open(){
mydb = SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE);
}







برای close:
public void close(){
mydb.close();
}



(اگه دستورات open و close کردن اشتباهه بگید. ولی این دستورات در برنامه ،دیتابیس رو درست باز کرد برای من)
حالا مثلا اون اسم رو با toast نشون میدم.
حالا وقتی برنامه رو اجرا میکنم toast اسم درست رو نشون میده ولی در logcat این ارور ها رو میده و وقتی که مرتبا از این اکتیویتی به اکتیویتی قبلی روم و دوباره به این برگردم هر دفعه ارور های logcat طولانی تر میشه و بعد از چندین بار forceclose میده.
ارور:




08-25 16:11:44.050: E/SQLiteDatabase(3538): close() was never explicitly called on database 'data/data/com.example.myapp/databases/database'
08-25 16:11:44.050: E/SQLiteDatabase(3538): android.database.sqlite.DatabaseObjectNotClosedExc eption: Application did not close the cursor or database object that was opened here
08-25 16:11:44.050: E/SQLiteDatabase(3538): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
بعد از این خط هم همینطور
at .......
at .......
at .......
میاره که به جای .....آدرس میده مثله خط آخر سه خط بالا






من تو سایت های خارجی دیدم وقتی کسی این سوال رو می پرسه میکن باید cursor و database ر ببنده. من کار های اون رها را انجام دادم ولی کار نداد. یا من اشتباه انجام دادم یا اون ها اشتباه گفتند.


لطفا اگه با این موضوع آشنایی دارید بگید چی کار کنم این ارور بره تا ببینم force close برنامه به خاطر اینه یا نه.
اگه نمیدونید همین خط


close() was never explicitly called on database





رو تو گوگل سرچ کنید جوابای دیگران میاد. ببینید اگه متوجه شدید کمکم کنید.

میبینید خیلی توضیحاتم رو با جزئیات نوشتم که مشکلی برای شما پیش نیاد برای فهمیدم روش من.
منتظر هستم
از همه ممنونم

ali.s7092
یک شنبه 01 شهریور 1394, 00:22 صبح
با سلام من از کدهای زیر استفاده می کنم: فقط در جایی که نوشته شده name your package نام پکیج برنامه و در جایی که نوشته شده name database نام فایل دیتابیس که در پوشه assest قرار دارد را تغییر دهید

public class database extends SQLiteOpenHelper { public final String path="data/data/name your package/databases/"; public final String Name="name database"; public SQLiteDatabase mydb; private final Context mycontext; public database(Context context) { super(context, "name database", null, 1); mycontext=context; } @Override public void onCreate(SQLiteDatabase arg0) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } public void useable(){ boolean checkdb=checkdb(); if(checkdb){ }else{ this.getReadableDatabase(); try{ copydatabase(); }catch(IOException e){ throw new Error("Error copying database"); } } } public void open(){ mydb=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE); } public synchronized void close(){ if(mydb != null) mydb.close(); super.close(); } public boolean checkdb(){ SQLiteDatabase db=null; try{ db=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READONLY); } catch(SQLException e) { } if(db!=null) db.close(); //mydb.close(); return db !=null ? true:false ; } public void copydatabase() throws IOException{ OutputStream myOutput = new FileOutputStream(path+Name); byte[] buffer = new byte[1024]; int length; InputStream myInput = mycontext.getAssets().open(Name); while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myInput.close(); myOutput.flush(); myOutput.close(); } }

hadihs
دوشنبه 02 شهریور 1394, 00:43 صبح
سلام
از شما خیلی ممنونم. خیلی کمکم کرد.
:لبخندساده: