2

我在这里看到了很多关于它的帖子,但我只是无法让我的应用程序停止向我发送关于我没有关闭数据库的错误。我的数据库有时是由活动访问,有时是来自后台类(服务)。

我添加到活动的 using DB

protected void onDestroy() {
    Log.d("OnDestroy", "called");
    sqlAdapter helper = new sqlAdapter(StartScreen.this);
    helper.close();
    super.onDestroy();
}

正如许多帖子中所建议的那样,但它不会解决问题。

有什么想法或解释可以帮助我理解吗?该应用程序没有崩溃或其他任何事情,但有很多关于我没有关闭数据库的错误

谢谢!

4

2 回答 2

0

每次完成后都应该关闭它。如果您创建一个cursor来访问它,那么在您获取数据并保存它或完成对它的处理之后,您应该关闭cursor. 然后在下次需要时再次打开它。这个答案应该可以帮助你

于 2013-03-29T14:09:48.793 回答
0

在您的示例中,您似乎正在创建一个新对象onDestroy而不是关闭旧对象。所以每次你做

sqlAdapter helper = new sqlAdapter(StartScreen.this);

您正在创建一个新对象,并且您将拥有大量未关闭的引用,这就是导致警告的原因。

相反,看起来您可能正在寻找一种单例设计模式,它允许您在应用程序中维护一个对象,然后在onDestroy.

public void onDestroy() {
    super.onDestroy();
    // close database
    final MySqlHelper helper = MySqlHelper.getInstance();
    helper.getDatabase().close();
}

否则,它会一直保持打开状态,直到onDestroy就像您现在尝试做的那样。这当然应该在适当的情况下使用,并且您正在您的应用程序中积极使用它。如果您很少使用数据库,每次使用后关闭它就可以了。

这个想法是,如果您执行适量的数据库打开/关闭调用,并且在该用例中效率更高,那么您将减少它们。

这是一个非常非常精简的单例示例。

public class MySqlHelper extends SQLiteOpenHelper {
    static MySqlHelper mInstance = null;
    static SQLiteDatabase mDatabase = null;

    public static MySqlHelper getInstance() {
        if (mInstance == null) {
            // call private constructor
            mInstance = new MySqlHelper();
        }
        mDatabase = mInstance.getWritableDatabase();
        while(mDatabase.isDbLockedByCurrentThread() || mDatabase.isDbLockedByOtherThreads()) {
            // loop until available
        }
        return mInstance;
    }

    private MySqlHelper() {
        // mContext here is just a placeholder for your ApplicationContext
        // that you should have available to this class.
        super(mContext, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // all other filled out methods like onCreate, onUpgrade, etc
}

现在您可以使用它来实现您的数据源

public class MyDataSource {
    // Database fields
    private final SQLiteDatabase mDatabase;
    private final MySqlHelper mHelper;

    public MyDataSource() {
        mHelper = MySqlHelper.getInstance();
        mDatabase = mHelper.getDatabase();
    }

    // add your custom methods 

    private int update(ContentValues values, String whereClause) {
        int rowsUpdated = 0;
        synchronized (mDatabase) {
            rowsUpdated = mDatabase.update(MySqlHelper.TABLE_NAME, values, whereClause, null);
        }
        return rowsUpdated;
    }

    public int updateById(ContentValues values, int id) {
        final String whereClause = MySqlHelper.COLUMN_ID + "=" + id;
        return this.update(values, whereClause);
    }
}
于 2013-03-29T14:36:09.763 回答