2015-11-10 2 views
1

я столкнулся иногда SQLite проблемы, несколько раз моего приложения зависнет, и ошибкаAndroid SQLite вопроса «Невозможно выполнить эту операцию, так как пул соединения был закрыт»

Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 

это моя функция, где ошибка происходит от

public List<contacts> getAllcontacts() { 
List<contacts> contactsl = new LinkedList<contacts>(); 

// 1. build the query 
String query = "SELECT * FROM contacts"; 

// 2. get reference to writable DB 
SQLiteDatabase db = this.getWritableDatabase(); 
Cursor cursor = db.rawQuery(query, null); 

// 3. go over each row, build a contact and add it to list 
contacts contact = null; 
if (cursor.moveToFirst()) { 
    do { 
     contact = new contacts(); 

     contact.setName(cursor.getString(1)); 
     contact.setNumero(cursor.getString(3)); 
     contact.setProfil(cursor.getString(2)); 
     contact.setShow(cursor.getString(5)); 
     contact.setBlocked(cursor.getString(4)); 
     contact.setObjectid(cursor.getString(6)); 
     contactsl.add(contact); 
    } while (cursor.moveToNext()); 
} 

return contactsl; 
} 

ошибки показывает, когда я выполняю функцию, когда я тестирую мое приложение и пытаюсь запустить функцию более чем один раз, может быть.

Вот создание базы данных:

private static sql sInstance; 

private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_NAME = "Contact"; 

public static sql getInstance(Context context) { 

// Use the application context, which will ensure that you 
// don't accidentally leak an Activity's context. 
if (sInstance == null) { 
    sInstance = new sql(context.getApplicationContext()); 
} 
return sInstance; 
} 

public sql(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String CREATETABLE = "CREATE TABLE contacts (" + 
      "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      "name TEXT, "+ 
      "profil TEXT, "+ 
      "phone TEXT UNIQUE ,"+ 
      "blocked TEXT, "+ 
      "show TEXT , "+ 
      "objectid TEXT)"; 

    db.execSQL(CREATETABLE); 
} 




@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int `newVersion) {` 
    // TODO Auto-generated method stub 
    db.execSQL("DROP TABLE IF EXISTS contacts"); 

    this.onCreate(db); 
} 
+0

Как вы инстанцировании вашей базы данных Helper? –

+0

Сообщение обновлено со всем созданием моей базы данных –

ответ

1

Если вы закрываете свой DBHelper преждевременно вы, вероятно, получите эту ошибку. Найдите код, если вы закроете своего помощника и отключите его, и посмотрите, не по-прежнему ли вы столкнулись с этой ошибкой.

Возможно, попробуйте этот шаблон для создания экземпляра вашего DBHelper.

public class MyDBHelper extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME = "myDatabase.db"; 
    private static final int SCHEMA = 1; 
    private static volatile MyDBHelper sInstance; 


    private MyDBHelper(Context context) { 
     super(context, DATABASE_NAME, null, SCHEMA); 
    } 

    public static MyDBHelper getInstance(Context context) { 
     if (sInstance == null) { 
      synchronized (MyDBHelper.class) { 
       if (sInstance == null) { 
        sInstance = new MyDBHelper(context.getApplicationContext()); 
       } 
      } 
     } 
     return sInstance; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // create your tables here 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // handle db upgrade or leave blank 
    } 
} 

В ответ на ваш комментарий, вы можете закрыть базу данных, когда ваш экземпляр получает окончательно

@Override 
public void finalize() throws Throwable { 
    sInstance.close(); 
    super.finalize(); 
} 
+0

Так что я не должен использовать «db.close» во всем классе SQLite? –

+0

Сохранение открытого соединения оказывает минимальное влияние на формирование, конечно же, вы должны закрыть его, когда вы уверены, что закончили работу с вашей базой данных. –

+0

Большое спасибо –

Смежные вопросы