Android更改数据库路径问题

时间:2011-11-17 08:33:44

标签: android sqlite storage

我在自定义databaseHelper.class中更改数据库的路径时遇到一些问题。所以在开始时我将数据库放在内部存储中的默认数据库文件夹中,但现在我想将它放在files/documents/users/servername/data中,但是当我更改初始化我的存储路径的字符串时,放置在那里的数据库是空的。我忘了提到实际上我的应用程序的资产文件夹中有sqlite文件,我正在将文件从那里复制到我的内存中。所以这是我正在使用的一段代码:

private static final int DATABASE_VERSION = 1;
private static String DB_PATH_PREFIX = "/data/data/";
private static String DB_PATH_SUFFIX = "/databases/";

public UserDatabaseHelper(Context context,  // String dbname,
                CursorFactory factory, int version) {
        super(context,"stampii_tpl.sqlite", factory, version);
        this.context = context;
        Log.i(TAG, "Create or Open database : " + "stampii_tpl.sqlite");
}

private static void copyDataBase(Context aContext)
                throws IOException {

        // Open your local db as the input stream
        InputStream myInput = aContext.getAssets().open("stampii_tpl.sqlite");

        // Path to the just created empty db
        String outFileName = getDatabasePath(aContext);

        Log.i(TAG, "Check if create dir : " + DB_PATH_PREFIX
                        + aContext.getPackageName() + DB_PATH_SUFFIX);

        // if the path doesn't exist first, create it
        File f = new File(DB_PATH_PREFIX + aContext.getPackageName()
                        + DB_PATH_SUFFIX);
        if (!f.exists())
                f.mkdir();

        Log.i(TAG, "Trying to copy local DB to : " + outFileName);

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
        }

        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

        Log.i(TAG, "DB (" + "stampii_tpl.sqlite" + ") copied!");
}
private static boolean checkDatabase(Context aContext) {
        SQLiteDatabase checkDB = null;

        try {
                String myPath = getDatabasePath(aContext);

                Log.i(TAG, "Trying to conntect to : " + myPath);
                checkDB = SQLiteDatabase.openDatabase(myPath, null,
                                SQLiteDatabase.OPEN_READONLY);
                Log.i(TAG, "Database " + "stampii_tpl.sqlite" + " found!");
                checkDB.close();
        } catch (SQLiteException e) {
                Log.i(TAG, "Database " + "stampii_tpl.sqlite" + " does not exists!");

        }

        return checkDB != null ? true : false;
}

@SuppressWarnings("unused")
private static String getDatabasePath() {
        return getDatabasePath(context);
}

private static String getDatabasePath(Context aContext) {
        return DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX
                        + "stampii_tpl.sqlite";
}

如果我尝试将DB_PATH_SUFFIX更改为:/files/documents/users/servername/data我所拥有的数据库为空,并且没有在assets文件夹中创建的表。

所以任何想法如何解决?

2 个答案:

答案 0 :(得分:0)

目前还不清楚files/documents/users/servername/data是否与您的应用程序或根文件系统相关。

经验法则:不要使用指向/来自根文件系统的绝对路径名。永远。 打破并最终陷入愚蠢的错误!

要获取应用程序的根目录,请使用:

String ROOT_DIR = context.getFilesDir().getAbsolutePath();

从那里,将数据库移动到您想要的任何位置(在应用程序的存储树下)。

答案 1 :(得分:0)

您应该在getDatabasePath()

中覆盖Activity方法
@Override
public File getDatabasePath(String name)
{
    //blah-blah
}