Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android更改数据库路径问题_Android_Sqlite_Storage - Fatal编程技术网

Android更改数据库路径问题

Android更改数据库路径问题,android,sqlite,storage,Android,Sqlite,Storage,在自定义的databaseHelper.class中更改数据库路径时,我遇到了一个小问题。因此,在开始时,我将数据库放在内部存储的默认数据库文件夹中,但现在我想将其放在文件/文档/用户/服务器名/数据中,但当我更改初始化存储路径的字符串时,放在那里的数据库是空的。我忘了提到,实际上我在应用程序的资产文件夹中有sqlite文件,我正在将该文件从那里复制到我的内存中。下面是我正在使用的一段代码: private static final int DATABASE_VERSION = 1; priva

在自定义的
databaseHelper.class
中更改数据库路径时,我遇到了一个小问题。因此,在开始时,我将数据库放在内部存储的默认数据库文件夹中,但现在我想将其放在
文件/文档/用户/服务器名/数据中,但当我更改初始化存储路径的字符串时,放在那里的数据库是空的。我忘了提到,实际上我在应用程序的资产文件夹中有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\u PATH\u后缀
更改为:
/files/documents/users/servername/data
,我在那里的数据库是空的,并且没有在文件from assets文件夹中创建的表


你知道怎么解决吗

不清楚
文件/文档/用户/服务器名/数据是否与应用程序或根文件系统相关

经验法则:不要使用指向根文件系统的绝对路径名。曾经事情会破裂,最终变成愚蠢的虫子

要获取应用程序的根目录,请使用以下命令:

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

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

您应该覆盖
活动中的
getDatabasePath()
方法

@Override
public File getDatabasePath(String name)
{
    //blah-blah
}

实际上现在我数据库文件夹的路径是
data/data/app\u package\u name/databases
,我想把文件复制到
data/data/app\u package\u name/files/documents/users/data
,但实际上你的代码甚至没有创建目录,也没有将空文件复制到
databases
目录。你知道哪里会是我的错吗?可能对你有用。