You need to either close the database object or hold the database object so that a variable is specified in your Content Provider that refers to the database object, allowing garbage collection to ignore the open database.
, , , , .
, , ( ), , , .
, SQLiteCursor SQLiteDatabase.CursorFactory :
public class MyCursor extends SQLiteCursor
{
final SQLiteDatabase mDatabase;
final int mID;
public MyCursor(SQLiteDatabase database,
SQLiteCursorDriver driver,
String table,
SQLiteQuery query,
int cursorID)
{
super(database, driver, table, query);
mDatabase = database;
mID = cursorID;
}
@Override
public void close()
{
super.close();
if ( mDatabase != null )
{
mDatabase.close();
}
}
public void closeForReuse()
{
super.close();
}
@Override
public String toString()
{
return super.toString() + ", ID# " + mID;
}
}
class MyCursorFactory implements SQLiteDatabase.CursorFactory
{
public Cursor newCursor ( SQLiteDatabase database,
SQLiteCursorDriver driver,
String editTable,
SQLiteQuery query )
{
int cursorID = MyProvider.CursorID++;
return new MyCursor(database,
driver,
editTable,
query,
cursorID);
}
}
-, , , IllegalState . . , , , .
MyProvider, CursorID MyProvider.