SQLite数据库从来没有接近我的Andr​​oid应用 [英] SQLite database never close in my Android app

查看:208
本文介绍了SQLite数据库从来没有接近我的Andr​​oid应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的Andr​​oid应用程序的问题。我使用code波纹管在AsyncTask的打开SQLite数据库。一切工作正常,但是当我尝试在的onStop()关闭数据库的onDestroy 方法,它永远不会关闭。

I have a problem with my Android application. I'm using code bellow to opening SQLite database in AsyncTask. Everything works fine but when I try to close database in onStop() or onDestroy method, it's never closed.

code,用于创建和打开数据库:

公共类SQLiteDB扩展SQLiteOpenHelper {

public class SQLiteDB extends SQLiteOpenHelper{

private final Context context;  
private SQLiteDatabase sqliteDatabase = null;

public SQLiteDB(Context context, String DBName) {
    super(context, DBConstant.DB_NAME, null, context.getResources().getInteger(ppredota.android.navigation.view.activities.R.string.database_version));
    this.context = context;
}

public void createDB() throws IOException{


    if(existDB()){
        this.getReadableDatabase();
        this.close();
    }
    else {
        this.getWritableDatabase();
        try {
            copyDB();
            this.close();   
        }
        catch (Exception e) {
            throw new Error("Chyba pri kopirovani databaze");
        }
    }
}
private boolean existDB() {

    SQLiteDatabase checkDatabase = null;

    try{
        String fullPath = DBConstant.DB_PATH + DBConstant.DB_NAME;
        checkDatabase = SQLiteDatabase.openDatabase(fullPath, null, SQLiteDatabase.OPEN_READWRITE);
    }
    catch (SQLiteException sqle) {
        Log.i("existDB()", "Databaze nelze otevrit, neexistuje");
    }
    if(checkDatabase == null){
        Log.i("existDB", "Databaze jeste neexistuje...");
        return false;
    }
    else{
        Log.i("existDB", "Databaze uz existuje...");
        checkDatabase.close();
        return true;
    }

}

private void copyDB() throws IOException {

    InputStream inDBStream = context.getAssets().open(DBConstant.DB_NAME);
    String newDBPath = DBConstant.DB_PATH + DBConstant.DB_NAME;

    OutputStream outDBStream = new FileOutputStream(newDBPath);
    Log.i("copyDB", "Otevren outputstream s cestou k nove databazi");

    byte[] buffer = new byte[1024];
    int length;
    while ((length = inDBStream.read(buffer))>0){
        outDBStream.write(buffer, 0, length);
    }

    outDBStream.flush();
    outDBStream.close();
    inDBStream.close();
}

public void openDB() throws SQLException {
    String fullPath = DBConstant.DB_PATH + DBConstant.DB_NAME;
    if(sqliteDatabase!=null){
        if(sqliteDatabase.isOpen()){
            Log.i("openDB()", "Databaze je jiz otevrena");
        }
        else{
            sqliteDatabase = SQLiteDatabase.openDatabase(fullPath, null, SQLiteDatabase.OPEN_READONLY);
            Log.i("openDB()", "Databaze" + sqliteDatabase.getPath() + "otevrena");
        }
    }
    else{
        sqliteDatabase = SQLiteDatabase.openDatabase(fullPath, null, SQLiteDatabase.OPEN_READONLY);
        if(sqliteDatabase.isOpen()){
            Log.i("openDB()", "Databaze otevrena");
        }

    }
}
@Override
public void close() {

    if(sqliteDatabase!=null){
        sqliteDatabase.close();
        Log.i("close()", "Databaze zavrena");
    }
    super.close();

}

public SQLiteDatabase getSQLiteDatabase() {
    if(sqliteDatabase==null){
        Log.i("getSQLiteDatabase()","Problem, vraci sqliteDatabase = null");
    }
    else{
        Log.i("getSQLiteDatabase()","instance sqliteDatabase vracena bez problemu");
    }

    return sqliteDatabase;

}

AssyncTask类:

公共类OpenDatabaseTask扩展的AsyncTask {

public class OpenDatabaseTask extends AsyncTask {

private Context context;
private SQLiteDB sqliteDB;

public OpenDatabaseTask(Context context,SQLiteDB sqliteDB) {
    this.context = context;
    this.sqliteDB = sqliteDB;
}
@Override
protected Void doInBackground(Void... params) {
    publishProgress();

    try {
        sqliteDB.createDB();
    } catch (IOException e) {
        e.printStackTrace();
    }
    sqliteDB.openDB();

    return null;
}
@Override
protected void onProgressUpdate(Void...unused){
    Log.i(OpenDatabaseTask.class.toString(), "Spusteno vlakno");
}

}

和活动(仅重要部分):

    private SQLiteDB sqliteDB;
    private SQLiteData sqliteData;
    private OpenDatabaseTask openDatabaseTask;

 @Override
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.navigatemenu);

        sqliteDB = new SQLiteDB(getApplicationContext(), sourceDatabaseName);
        openDatabaseTask = new OpenDatabaseTask(getApplicationContext(), sqliteDB);
        openDatabaseTask.execute();

    protected void onDestroy(){
        super.onDestroy();
        Log.i("onDestroy()", "Pokus o zavreni databaze");
            //here is the problem, database never closed
        sqliteDB.close();
    }
    protected void onStop(){
        super.onStop();
        Log.i("onStop()", "Pokus o zavreni databaze");
            //here is the problem, database never closed
        sqliteDB.close();
    }
    protected void onPause(){
        super.onPause();
    }
    protected void onResume(){
        super.onResume();
        //Log.i("onResume()", "Pokus o otevreni databaze");
    }
}

所以,当我尝试使用的close()的方法来关闭数据库,sqliteDatabase总是空和数据库永远不会关闭。因此,数据库仍然打开,并调用后的onDestroy 异常发生。

So when I try use a close() method to closing database, sqliteDatabase is always null and database is never closed. So database is still opened and after calling onDestroy exception occurs.

感谢您的时间和抱歉,我的英语水平,我是捷克:)

Thank you for your time and sorry for my english, I'm czech :)

推荐答案

我有一个沉重的DB交互的应用程序。我没有用户的帮手。我的数据库被打开很多次,在UI线程和后台线程太多,但从来没有关闭。没有问题,到目前为止,不知道如果是做正确的方式...

I have an app with heavy db interaction. I didnt user helper. My db is opened lots of times, in UI thread and in background thread too, but never ever closed. Had no problems so far, dont know if it is the right way to do...

这篇关于SQLite数据库从来没有接近我的Andr​​oid应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆