2011-09-17 14 views
-2

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/誰かがこの行が何をしているのか説明できますか?このブログで

それは1行this.getReadableDatabase();ですが、私はそれが何をするか理解していないが、私は自分のコードからそれを削除した場合には動作を停止します。

/** 
* Creates a empty database on the system and rewrites it with your own database. 
* */ 
public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 

     //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

} 
+3

ちょうどその上で役立つコメントがあります。また、すべてのドキュメントを検索しようとしましたか? http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase()にアクセスしましたか? –

+0

ドキュメントを読む! http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase() –

答えて

2

更新とセットアップのライフサイクルを扱いますgetWritableDatabase()を呼び出します。なんらかの理由で失敗した場合、dbを読み取り専用モードで開きます。ここで

public synchronized SQLiteDatabase getReadableDatabase() { 
    if (mDatabase != null && mDatabase.isOpen()) { 
     return mDatabase; // The database is already open for business 
    } 

    if (mIsInitializing) { 
     throw new IllegalStateException("getReadableDatabase called recursively"); 
    } 

    try { 
     return getWritableDatabase(); 
    } catch (SQLiteException e) { 
     if (mName == null) throw e; // Can't open a temp database read-only! 
     Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e); 
    } 

    SQLiteDatabase db = null; 
    try { 
     mIsInitializing = true; 
     String path = mContext.getDatabasePath(mName).getPath(); 
     db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY); 
     if (db.getVersion() != mNewVersion) { 
      throw new SQLiteException("Can't upgrade read-only database from version " + 
        db.getVersion() + " to " + mNewVersion + ": " + path); 
     } 

     onOpen(db); 
     Log.w(TAG, "Opened " + mName + " in read-only mode"); 
     mDatabase = db; 
     return mDatabase; 
    } finally { 
     mIsInitializing = false; 
     if (db != null && db != mDatabase) db.close(); 
    } 
} 

getWritableDatabaseの実装(ある)

public synchronized SQLiteDatabase getWritableDatabase() { 
    if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { 
     return mDatabase; // The database is already open for business 
    } 

    if (mIsInitializing) { 
     throw new IllegalStateException("getWritableDatabase called recursively"); 
    } 

    // If we have a read-only database open, someone could be using it 
    // (though they shouldn't), which would cause a lock to be held on 
    // the file, and our attempts to open the database read-write would 
    // fail waiting for the file lock. To prevent that, we acquire the 
    // lock on the read-only database, which shuts out other users. 

    boolean success = false; 
    SQLiteDatabase db = null; 
    if (mDatabase != null) mDatabase.lock(); 
    try { 
     mIsInitializing = true; 
     if (mName == null) { 
      db = SQLiteDatabase.create(null); 
     } else { 
      db = mContext.openOrCreateDatabase(mName, 0, mFactory); 
     } 

     int version = db.getVersion(); 
     if (version != mNewVersion) { 
      db.beginTransaction(); 
      try { 
       if (version == 0) { 
        onCreate(db); 
       } else { 
        onUpgrade(db, version, mNewVersion); 
       } 
       db.setVersion(mNewVersion); 
       db.setTransactionSuccessful(); 
      } finally { 
       db.endTransaction(); 
      } 
     } 

     onOpen(db); 
     success = true; 
     return db; 
    } finally { 
     mIsInitializing = false; 
     if (success) { 
      if (mDatabase != null) { 
       try { mDatabase.close(); } catch (Exception e) { } 
       mDatabase.unlock(); 
      } 
      mDatabase = db; 
     } else { 
      if (mDatabase != null) mDatabase.unlock(); 
      if (db != null) db.close(); 
     } 
    } 
} 
+0

これは質問と何が関係していますか? –

+1

質問は '何が '' getReadableDatabase() 'do?'です。 – Reno

1

this.getReadableDatabase();は、メソッドgetReadableDatabase()を呼び出します。 SQLiteOpenHelperクラスからこれは、DataBaseHelperがSQLiteOpenHelperのサブクラスであるため可能です。これはこの行によって決定されます。

public class DataBaseHelper extends SQLiteOpenHelper 
1

このクラスはSQLiteOpenHelperのサブクラスです。方法の基準から

テイク:[1]

作成及び/又は読み出し及び 書き込みに使用されるデータベースを開きます。これが初めて呼び出されると、データベースは で開き、onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int) および/またはonOpen(SQLiteDatabase)が呼び出されます。

は、だから、基本的にはちょうどあなたのためのSQLiteDatabase準備し、このAPIは、データベースを開くことをあなたが見ることができる機能の実装等から

[1] http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase%28%29