مشکل دیتابیس(لطفا یه بار دیگه ببینید)
باسلام
نرم افزار من از یک دیتابیس استفاده میکنه
وقتی نرم افزار رو روی گوشی اجرا میکنم کرش میکنه
اما روی امولیتور درست اجرا میشه و درهنگام اجرا شدن یه خطا میگیره
Finalizing a Cursor that has not been deactivated or closed. database = /data/data/mjz.soal_pasokh.mkh/databases/namaz, table = namaz, query = SELECT id, soal, aye, pasokh, fav, ezafi1, ezafi2, ezafi3 FROM namaz
و بعد از این خط اینو نوشته
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
که این خطا با توجه به کمک دوستان که گفتن cursor باید بسته بشه حل شد و من cursor رو بستم
اما حالا یه مشکل جدید بعد از حل این مشکل درست شده که این هست
java.lang.RuntimeException: Unable to start activity ComponentInfo{mjz.soal_pasokh.mkh/mjz.soal_pasokh.mkh.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT id, soal, aye, pasokh, fav, ezafi1, ezafi2, ezafi3 FROM namaz)
این خطا میگه تلاش برای دوباره باز کردن یک شی در حال حاضر بسته
اما منظورش رو نمیدونم
این کد DBAdapter برنامم
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
//DATABASE_VERSION = 1
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(CREATE_TABLE);
}
catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---retrieves all the contacts---
public List<soal_pasokh> getAllContacts()
{
Cursor cursor = db.query(DATABASE_TABLE, yek_name, null, null, null, null, null);
List<soal_pasokh> nams = cursorToList(cursor);
return nams;
}
private List<soal_pasokh> cursorToList(Cursor cursor) {
List<soal_pasokh> nams = new ArrayList<soal_pasokh>();
if (cursor.getCount() > 0)
{
while (cursor.moveToNext()) {
soal_pasokh nam = new soal_pasokh();
nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
nam.setSoal(cursor.getString(cursor.getColumnIndex(KEY_SOAL)));
nam.setAye(cursor.getString(cursor.getColumnIndex(KEY_AYE)));
nam.setPasokh(cursor.getString(cursor.getColumnIndex(KEY_PASOKH)));
nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
nam.setEzafi1(cursor.getString(cursor.getColumnIndex(KEY_EXTRA1)));
nam.setEzafi2(cursor.getString(cursor.getColumnIndex(KEY_EXTRA2)));
nam.setEzafi3(cursor.getString(cursor.getColumnIndex(KEY_EXTRA3)));
nams.add(nam);
}
;
}
return nams;
}
//---retrieves a particular contact---
public soal_pasokh getContact(int new_id) throws SQLException
{
List<soal_pasokh> nams = new ArrayList<soal_pasokh>();
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_ID + " == '" + new_id + "'", null,
null, null, null, null);
soal_pasokh nam = new soal_pasokh();
if (cursor != null) {
cursor.moveToFirst();
nams = cursorToList(cursor);
}
Log.i(TAG, nam.getSoal() + ",database");
return nams.get(0);
}
///search
public List<soal_pasokh> findContacts(String nam, String row) throws SQLException
{
Cursor cursor =
db.query(true, DATABASE_TABLE, yek_name, row + " LIKE '%" + nam + "%'", null,
null, null, null, null);
List<soal_pasokh> nams = cursorToList(cursor);
return nams;
}
///fav?
public List<soal_pasokh> findFAVContacts() throws SQLException
{
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, KEY_FAV + " == " + 1 + "", null,
null, null, null, null);
List<soal_pasokh> nams = cursorToList(cursor);
return nams;
}
//---updates a contact---
public boolean updateContact(soal_pasokh up_nam)
{
ContentValues args = new ContentValues();
args.put(KEY_ID, up_nam.getId());
args.put(KEY_SOAL, up_nam.getSoal());
args.put(KEY_AYE, up_nam.getAye());
args.put(KEY_PASOKH, up_nam.getPasokh());
args.put(KEY_FAV, up_nam.getFav());
args.put(KEY_EXTRA1, up_nam.getEzafi1());
args.put(KEY_EXTRA2, up_nam.getEzafi2());
args.put(KEY_EXTRA3, up_nam.getEZafi3());
return db.update(DATABASE_TABLE, args, KEY_ID + "=" + up_nam.getId(), null) > 0;
}
}
اینم MainActivity
lst = getListView();
db = new DBAdapter(getBaseContext());
db.open();
soalha = db.getAllContacts();
lst.setLayoutAnimation(new LayoutAnimationController(animation1));
if (soalha.size() == 0) {
String so_paPath = "/data/data/" + getPackageName()
+ "/databases/";
try {
CopyDB(getBaseContext().getAssets().open("mydata1"), new FileOutputStream(so_paPath + "/namaz"));
Log.i(DBAdapter.TAG, "db copy shod");
soalha = db.getAllContacts();
refreshDisplay();
Log.i(DBAdapter.TAG, soalha.size() + "= tedad soalha");
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
refreshDisplay();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
soal_pasokh soal_pasokh = soalha.get(position);
Intent next = new Intent(this, showSoal.class);
next.putExtra("thissoal", soal_pasokh);
startActivity(next);
}
public void CopyDB(InputStream inputStream, OutputStream outputStream)
throws IOException {
// ---copy 1K bytes at a time---
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}
public void refreshDisplay() {
Log.i(DBAdapter.TAG, soalha.size() + "= tedade soalha");
ArrayAdapter<soal_pasokh> adapter = new soal_pasokhAdapter(this, soalha);
setListAdapter(adapter);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
currentPosition = lst.getFirstVisiblePosition();
Log.i(DBAdapter.TAG, currentPosition + "save shod");
db.close();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
db.open();
soalha = db.getAllContacts();
lst.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
lst.setSelection(currentPosition);
}
});
refreshDisplay();
}
}
در MainActivity
این خط رو
String so_paPath ="/data/data/"+ getPackageName()+"/databases/";
به
String so_paPath ="/data/data/"+ packageinfo.packageName+"/databases/";
تغییر بده تا توی پکیجت بی افته
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .