2016-04-20 13 views
0

AndroidのバックグラウンドスレッドでSqliteデータベースを開くことが何を意味するのかを理解しようとしています。今私はクラスDatabaseHelperを使ってデータベースに静的/シングルトンパターンを使用していますので、一度だけ開く必要がありますが、それは良い練習を使って開きたいのですが、なぜ私はActivity直接(またはヘルパーのコンストラクタ内など)バックグラウンドスレッドでSqliteデータベースを開く

私のクラス:どこかActivity内部

DatabaseHelper mDatabaseHelper = DatabaseHelper.getInstance(this); 

    Thread thread = new Thread("OpenDbThread") { 
     public void run(){ 
     mDatabaseHelper.open(); 
     } 
    }; 


    thread.start(); 

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static volatile SQLiteDatabase mDatabase; 
    private static DatabaseHelper mInstance = null; 
    private static Context mContext; 

    // ... 

    public static synchronized DatabaseHelper getInstance(Context context) { 
     /** 
     * use the application context as suggested by CommonsWare. 
     * this will ensure that you don't accidentally leak an Activity's 
     * context (see this article for more information: 
     * http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html) 
     */ 
     if (mInstance == null) { 
      mInstance = new DatabaseHelper(context.getApplicationContext()); 
     } 
     return mInstance; 
    } 

    private DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     mContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DB_CREATE_SOME_TABLE); //some SQL expression 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(DB_ALTER); 
    } 

    public void open() throws SQLException { 
     mDatabase = getWritableDatabase(); 
    } 

    public void close() { 
     mDatabase.close(); 
    } 

    public boolean isOpen() { 
     return mDatabase.isOpen(); 
    } 

    //below this would be various CRUD functions operating on mDatabase 
    // ... 
    // ... 
} 

それはあなたがこのような何かをしなければならないと言うことは正しいですか?

答えて

0

あなたが書いたコードは、バックグラウンドスレッドでデータベースを開くことは間違いありません。しかし、実際にはthread.isAlive()がfalse(またはmDatabase.isOpen()がtrueを返す)までデータベースが開かれているとは限りません。また、アクティビティをスレッドからコールバックをリッスンさせることもできます。

関連する問題