Проблема с изменением базы данных Android - PullRequest
0 голосов
/ 17 ноября 2011

У меня небольшая проблема с изменением пути к моей базе данных в моем пользовательском 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 база данных, которая у меня там, пуста и не имеет таблиц, которые созданы в файле из папки активов.

Так есть идеи, как это исправить?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Вы должны переопределить getDatabasePath() метод в вашем Activity

@Override
public File getDatabasePath(String name)
{
    //blah-blah
}
0 голосов
/ 17 ноября 2011

Неясно, относится ли files/documents/users/servername/data к вашему приложению или к корневой файловой системе.

Практическое правило. Не используйте абсолютные пути, указывающие на / из корневой файловой системы. Когда-либо. Вещи будут ломаться и заканчиваться глупыми ошибками!

Чтобы получить корневой каталог вашего приложения, используйте это:

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

Оттуда переместите свою базу данных туда, куда вы хотите (ниже дерева хранения вашего приложения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...