Слабая реализация SQLite - как улучшить? - PullRequest
0 голосов
/ 06 марта 2011

Мое приложение в значительной степени опирается на базу данных, которая при первом открытии приложения должна скопировать себя из папки /assets/ в хранилище базы данных. Тем не менее, это кажется невероятно темпераментным: например, у меня есть почти такой же код в моих бесплатных и платных версиях, но одна сейчас работает, а другая нет.

Ребята, не могли бы вы взглянуть на мой код и посмотреть, что из этого вышло / может быть улучшено? Мой SQLiteOpenHelper можно найти здесь , а метод onCreate() моего DataProvider указан ниже:

@Override
public boolean onCreate() {

    dh = new DatabaseHelper(getContext());
    try {

        dh.createDataBase();

    } catch (IOException ex) {

    }
    try {

        dh.openDataBase();

    } catch (SQLiteException ex) {

        Toast.makeText(getContext(), "The database could not be copied\n" + ex.getMessage(), 
                Toast.LENGTH_LONG).show();

    }

    return true;

}

Спасибо!

EDIT

После ознакомления с эмулятором я знаю, что база данных существует, но по какой-то причине она просто не хочет ее читать ...

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Вы не должны жестко задавать путь к каталогу баз данных. Вместо того, чтобы собирать myPath каждый раз, когда вам это нужно, попробуйте создать в конструкторе следующий код:

Instance:

private File myPath;

А в конструкторе:

myPath =  context.getDatabasePath(DB_NAME);
1 голос
/ 06 марта 2011

Ниже приведен код, который я использовал для копирования баз данных (не уверен, может ли это исправить ошибку или нет, полагал, что альтернативный подход всегда стоит попробовать). В противном случае я не вижу ничего, что могло бы вызвать ошибку.

void copyFile(File src, File dst) throws IOException {
        FileChannel inChannel = new FileInputStream(src).getChannel();
        FileChannel outChannel = new FileOutputStream(dst).getChannel();
        try {
           inChannel.transferTo(0, inChannel.size(), outChannel);
        } finally {
           if (inChannel != null)
              inChannel.close();
           if (outChannel != null)
              outChannel.close();
        }
     }

Дополнительная мысль, зачем открывать и закрывать базу данных при проверке, существует ли она. Кажется, вы могли бы сойти с рук что-то вроде этого:

private boolean checkDataBase() {
    String myPath = DB_PATH + DB_NAME;
    return new File(myPath).exists();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...