SQLiteOpenHelper 在公用資料夾中具有完全限定的 DB 路徑 namedatabse

通常,Android-SQLiteOpenHelper 不允許儲存資料庫的完全限定路徑名。因此無法使用公共資料庫檔案。

如果提供自定義 ContextClass 並且在目標目錄中具有寫訪問許可權,則可以將 SQLiteOpenHelper 與自定義路徑一起使用。

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 3;
    .....

    DatabaseHelper(final Context context, String databaseName) 
    {
       super(new DatabaseContext(context), databaseName, null, DATABASE_VERSION);
    }
}

這是自定義 DatabaseContext 類,可以完成所有的魔術

class DatabaseContext extends ContextWrapper {

    private static final String DEBUG_CONTEXT = "DatabaseContext";

    public DatabaseContext(Context base) {
        super(base);
    }

    @Override
    public File getDatabasePath(String name) 
    {
        File sdcard = Environment.getExternalStorageDirectory();    
        String dbfile = sdcard.getAbsolutePath() + File.separator+ "databases" + File.separator + name;
        if (!dbfile.endsWith(".db"))
        {
            dbfile += ".db" ;
        }

        File result = new File(dbfile);

        if (!result.getParentFile().exists())
        {
            result.getParentFile().mkdirs();
        }

        if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN))
        {
            Log.w(DEBUG_CONTEXT,
                    "getDatabasePath(" + name + ") = " + result.getAbsolutePath());
        }

        return result;
    }

    /* this version is called for android devices >= api-11. thank to @damccull for fixing this. */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
        return openOrCreateDatabase(name,mode, factory);
    }

    /* this version is called for android devices < api-11 */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) 
    {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
        // SQLiteDatabase result = super.openOrCreateDatabase(name, mode, factory);
        if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN))
        {
            Log.w(DEBUG_CONTEXT,
                    "openOrCreateDatabase(" + name + ",,) = " + result.getPath());
        }
        return result;
    }
}

這是我對 SQLiteOpenHelper 問題的回答的副本,其中包含完全限定的 DB 路徑名