База данных, кажется, исчезает после того, как мое приложение загрузило ее.Идеи? - PullRequest
1 голос
/ 13 августа 2010

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

Однако, когда я загружаю APK в Android Market Place и загружаю его на телефон,приложение загружает базу данных, а затем вылетает, сообщая, что обработчик sqlite не смог открыть базу данных.

Ниже приведен код:

В SQLiteOpenHelper:

this.FULL_DB_PATH = new String(this.getWritableDatabase().getPath());
this.getWritableDatabase();

// Code for retrieving the database off of the server:

private void copyDataBase(){
        InputStream myInput=null;
        OutputStream myOutput=null;
        try{
            // opening connections
            URL url = new URL("server_url_here");
            URLConnection ucon=url.openConnection();
            myInput = ucon.getInputStream();     
            myOutput = new FileOutputStream(this.FULL_DB_PATH);

            // write to the db here
            byte[] buffer = new byte[1024*1024];
            int length;
            while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
            }

            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
         catch(Exception e)
         {

                try{
                    myOutput.flush();
                    myOutput.close();
                    myInput.close();
                }
                catch(Exception es){}
         }
    }

Я не знаю, почему мой коллега сохраняет БД с расширением mp3, но ... он работает, когда мы устанавливаем apk ad-hoc.

Для:

myOutput = new FileOutputStream(this.FULL_DB_PATH);

Я также пытался:

myOutput = this.getApplicationContext().openFileOutput(this.FULL_DB_PATH, Context.MODE_WORLD_READABLE);

Но это тоже не работает.

Любая помощь очень ценится !!Я пару часов рвал на себе волосы из-за этого, и я просто хочу, чтобы это закончилось, ха-ха.

Ответы [ 3 ]

1 голос
/ 14 августа 2010

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

Чтобы обойти это, вам нужно будет вручную добавить информацию в базу данных, используя db.insert (String, String, ContentValues) и db.update (String, ContentValues, String, String [])

Было бы неплохо иметь возможность делать то, что вы пытаетесь, но по соображениям безопасности это очень хорошо, что вы не можете.

1 голос
/ 13 августа 2010

Эмулятор предоставляет вам особый доступ, которого нет у реальных телефонов. Другими словами, я подозреваю, что вы непосредственно копируете файл в каталог баз данных на телефоне? Если это так, вы не можете сделать это на нерутированном телефоне. Надеюсь, кто-то вмешается и докажет, что я не прав, потому что это тоже проблема для меня Я хотел бы легко скачать файл БД и установить его. В качестве обходного пути мне приходится создавать новую базу данных и загружать схему и данные с помощью запросов.

EDIT: Я хотел бы поделиться с вами трюком. Это действительно просто. Вместо того, чтобы просто использовать db.insert / db.update /, включите их в транзакции. Фактически, я бы рассматривал всю сборку БД как транзакцию или, по крайней мере, только отдельные таблицы. Я испытал увеличение скорости транзакций в 10-50 раз, когда они ограничены, а затем зафиксированы одновременно.

0 голосов
/ 16 августа 2010

Два других ответа неверны, я верю. В моем приложении есть система резервного копирования, в которой резервные копии копируются на SD-карту, а затем копируются обратно в папку / data / при восстановлении резервной копии. Хотя я не знаю, почему ваш код не работает, вот мой код для копирования базы данных с SD-карты:

final InputStream in = new FileInputStream(from);
final OutputStream out = new FileOutputStream(to);
final byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
    out.write(buf, 0, len);
}
in.close();
out.close();

Просто для более тщательного изучения ошибки попробуйте загрузить ее на SD-карту, а затем используйте мой код, чтобы скопировать ее в папку данных. Объект "to" в моем коде выглядит так:

public static final String DATABASE_PATH = "/data/data/"+SomeClass.class.getPackage().getName()+"/databases/"+ DATABASE_NAME;
final File to = new File(Constant.DATABASE_PATH);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...