2013-12-11 77 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" />