2013-12-11 76 views
2

默認情況下,應用程序數據中創建應用程序的數據庫文件。是否可以在我們自己的路徑中創建數據庫文件,如「/mnt/sdcard/test.db」?在android中創建數據庫文件

我通過擴展SQLiteOpenhelper創建數據庫文件,但是它在應用程序數據位置創建。我想在SD卡位置創建。我試着用「db.OpenorCreateDatabase(Path)」。 它在該位置創建一個數據庫文件,當我試圖讀取該文件崩潰。如何做到這一點?

+3

是的,但它不是安全的,因爲sdcard可以被其他應用程序訪問。 – Nfear

+0

你能否詳細說明「它正在崩潰」? – Michael

回答

3

您可以使用SQLiteOpenHelper用(至少與Android 2.2)的自定義路徑,如果你提供一個自定義ContextClass,如果你有在目標目錄的寫入權限。

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; 
} 

@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; 
} 
} 
0

這是舊的,但對於那些正在尋找放置在訪問的目錄數據庫用於調試的目的,最簡單的方法:

在dbHelper構造

,加上替代路徑的分貝名稱:

private DbHelper(Context context) 
{ 
    super(context, "/mnt/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION); 
} 

並記住添加權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />