当前位置: 首页 > 知识库问答 >
问题:

Android SQLite问题“无法执行此操作,因为连接池已关闭”

司马作人
2023-03-14
 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);
}

共有1个答案

董小林
2023-03-14

如果过早关闭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();
}
 类似资料:
  • 我使用了SQLiteDataBaseHelper类,其getInstance方法更改为synchronize. 作为此答案,但仍然存在问题not fixed。

  • 我不明白为什么如果我之前调用,错误会说数据库是关闭的。请支持!谢谢:)

  • 我试着用谷歌搜索了很多个小时,但没有结果。请帮我把它修好。任何帮助都将不胜感激。谢谢!

  • 我已经在StackOverflow和web上搜索了这个问题的答案,但我找不到答案。当我在姜饼上运行我的应用程序时,它运行得很好。但是当我在4.2.2上运行它时,我会得到这样的错误:我有一个包含两个片段的SherlockFragmentActivity。 片段1: SherlockFragmentActivity: 我已经被困在这个问题上几个小时了(没有笑话),真的很感激任何帮助。再次感谢。

  • 问题内容: 我正在阅读有关此问题,但仍然没有找到解决方案。我注意到有时,我的应用会引发此错误: 我有一个使用此方法的文件,以获取其实例: 然后,我有类似这样的方法(它在发生该错误的行中崩溃)。它几乎从不崩溃,但有时会崩溃。 就这样,在我使用的所有方法中: 然后关闭游标和数据库。在这种情况下,该错误被抛出该行: 我不明白为什么如果我之前打电话,错误提示数据库已关闭。请支持!谢谢 :) 问题答案: 去

  • 我通过play framework和mariadb客户端使用hikari pool connection,由于我定期更新它们(play 2.6.5->2.6.6和mariadb 2.1.1->2.1.2,但不确定是否相关),我出现了以下错误: 我在这里发现了一个相关的问题,并试图将idleTimeout和maxLifetime更改为2分钟和5分钟,但错误仍然发生。 我使用的是HikariCP 2.