Pytanie jak przetestować aktualizowanie bazy danych SQLite przed załadowaniem nowej wersji mojej aplikacji w Sklepie Play na Androidzie


Nie otrzymuję takiej tabeli "table_name" w mojej przesłanej aplikacji po aktualizacji wersji aplikacji. Wyszedłem po testach, że dostaję ten problem dopiero po uaktualnieniu starej wersji aplikacji do nowej wersji aplikacji

Co zaimplementowałem

Zrobiłem kod w metodzie onUpgrade (), a także zaktualizowałem wersję db w konstruktorze, ale nie mogłem przetestować jej w urządzeniu.

krok 1)  Zwiększ kod wersji od 1 do 2

public databasehelper(Context context) {

        super(context, DATABASE_NAME, null, 2);
        this.myContext = context;
        try {
            createDataBase();
            openDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

Krok 2) dodano nową tabelę do onUpgrade () metoda

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.e("onUpgrade db", ">>>>called");
        switch (oldVersion) {
        case 1:
            db.execSQL(DATABASE_CREATE_notification_counter);
            Log.e("db version", ">>>"+oldVersion);
            // we want both updates, so no break statement here...
        case 2:
            Log.e("db version", ">>>"+oldVersion);
                  // I removed onCreate() method from here because new version will already have the new table
//          onCreate(db);
        }

    }

Krok 3) Metoda onCreate () dla nowej wersji bazy danych.

@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE_notification_counter); 
        Log.d("oncreate db", ">>>>called");
    }

Mam rozwiązanie do aktualizacji bazy danych link1  link2  link3  link4

Dlaczego nie mogłem tego przetestować

przesłaliśmy płatną aplikację do sklepu Play, więc muszę przetestować metodę aktualizacji db w emulatorze lub urządzeniu, używając dwóch różnych apk oznacza starszą wersję i nowszą wersję. i testowałem w urządzeniu po raz pierwszy przy użyciu starej wersji, a następnie nowej wersji (db zmienia się z dodaną nową tabelą w db), ale metoda onUpgrade () nie będzie w tej chwili wywoływana.

Pytanie:

1) Jak mogę przetestować aktualizację db przed aktualizacją nowej wersji na   grać w sklepie?

2) Będzie wywoływać tylko wtedy, gdy zaktualizujesz wersję ze sklepu Play   tylko?

Pomóż mi rozwiązać ten problem.

Odpowiedzi zostaną docenione. Z góry dziękuję.


11
2017-10-08 13:10


pochodzenie


dlaczego po prostu nie zainstalujesz obu wersji po kolei? Mam problem ze zrozumieniem, czego tu nie ma - njzk2
@ njzk2 Właściwie zrobiłem zmiany w moim kodzie, aby zaktualizować db, więc nie mogłem po prostu zainstalować mojej starej wersji z Eclipse bezpośrednio i dla nowej wersji testowałem na oba sposoby po prostu instaluję i z podpisaną apk ale bez powodzenia. - Maulik
nie masz źródła poprzedniego wydania? - njzk2
@ Njzk2 przepraszam, to był mój błąd. Przetestowałem go również bezpośrednio instalując na moim urządzeniu zarówno w wersji starszej, jak i nowszej z db. - Maulik
W takim razie nie rozumiem twojego pytania - njzk2


Odpowiedzi:


Wersja db przechowywana wewnątrz db. Po prostu utwórz db (db_old) ze starszą wersją niż w swoim DbHelper. Użyj DbHelper, aby połączyć się z db_old, a twoja metoda onUpgrade zostanie wywołana.

Możesz użyć istniejącego db jako db_old, po prostu zmniejsz jego wersję. Aby zmienić wersję, można użyć dowolnego edytora db sqite.

Jeśli nie chcesz pisać testu dla DbHelper i chcesz symulować aktualizację aplikacji, możesz użyć adb install -r dowództwo. Czytaj więcej tutaj.


4
2017-10-08 13:47



Dzięki za odpowiedź moje pytanie. czy możesz mi wyjaśnić w skrócie, dając mi przykład, aby zrozumieć to poprawnie? - Maulik
db to tylko plik z danymi. wersja danych jest również przechowywana w tym samym pliku. Jeśli chcesz wywołać funkcję onUpgrade, powinieneś otworzyć bieżący plik db za pomocą edytora sqlite i zmniejszyć wersję db. Przy następnym połączeniu się z db OnUpgrade zostanie wywołana i możesz sprawdzić, jak to działa. - Leonidos
Możesz także zwiększyć wersję db w DbHelper. Połącz się z bieżącą bazą danych. Powinien zostać wywołany OnUpgrade. - Leonidos
Masz na myśli wersję Schema lub wersję użytkownika w polu ustawień DB? - Maulik
Mam na myśli wzrost wersji w konstruktorze SQLiteOpenHelper. Liczba ta jest porównywana z numerem wersji bazy danych (przechowywanym w pliku db), a jeśli jest większa, onUpgrade zostanie wywołany. - Leonidos


Po długich poszukiwaniach i testowaniu mojej aplikacji wreszcie ...

Mam to działa! W klasie createDataBase brakuje linii:

Właśnie dodałem poniżej linię w moim kodzie createDataBase ()

this.getWritableDatabase();

Musimy dać pozwolenie na zapisanie bazy danych podczas tworzenia bazy danych, to zezwolenie pozwoli na zapisanie bazy danych podczas aktualizacji aplikacji ze sklepu Play.

Po pomyślnym otwarciu baza danych jest buforowana, więc możesz zadzwonić   tę metodę za każdym razem, gdy trzeba pisać do bazy danych. (Upewnić się   wywołać metodę close (), gdy już nie potrzebujesz bazy danych.) Błędy takie jak   złe uprawnienia lub pełny dysk może spowodować awarię tej metody, ale   przyszłe próby mogą się powieść, jeśli problem zostanie rozwiązany.

Aktualizacja bazy danych może zająć dużo czasu, nie powinieneś wywoływać tej metody   z głównego wątku aplikacji, w tym z   ContentProvider.onCreate ().

public void createDataBase() throws IOException 
        { boolean dbExist = checkDataBase(); 
          if (!dbExist) {
           this.getReadableDatabase();
            try {
                // ---If not created then copy the database---
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
          }
          else {
            /* This line: that has been solve my problem */
           this.getWritableDatabase();
          }
        }

public void openDataBase () wyrzuca SQLException {

      // --- Open the database---         String myPath = path + DATABASE_NAME;
      myDataBase = SQLiteDatabase.openDatabase(myPath, null,
              SQLiteDatabase.OPEN_READWRITE); // you also have to add open_readwrite condition here
              /*onUpgrade(myDataBase, 1, 2);*/ // no need to call upgrade     here it will be called automatically

  }

Musisz podać warunek zapisu podczas otwierania bazy danych.

Ponadto onUpgrade () jest wywoływana, gdy tworzony jest nowy obiekt klasy DataBaseHelper, ale tylko wtedy, gdy numery wersji bazy danych nie są zgodne. Oznacza to, że nie trzeba wywoływać "Aktualizuj" na własną rękę. Jeśli opublikujesz aktualizację swojej bazy danych, po prostu zwiększ jej wersję o jeden i zastosuj zmiany w metodzie onUpgrade ().

Mam to z podanego linku:

onUpgrade database - oldVersion - nowawersja

Mam nadzieję, że pomoże to każdemu przyszłym programistom!


3
2017-10-09 14:31





jak przetestować aktualizowanie bazy danych SQLite bez pobierania nowej wersji aplikacji ze sklepu Play w systemie Android

1) Jak mogę przetestować aktualizację db przed aktualizacją nowej wersji w sklepie Play?

pobrałem wtyczkę przeglądarki sqlite dla eclipse stąd

http://sourceforge.net/projects/sqlitebrowser/

i sprawdź ten samouczek, jak korzystać z wtyczki sqlite

http://www.coderzheaven.com/2011/04/18/sqlitemanager-plugin-for-eclipse/

po prostu skopiuj słoik z 1. linku i wklej go do folderu instalacyjnego Eclipse o nazwie plugin i ponownie uruchom Eclipse

następnie uruchom emulator i przejdź do paczki z DDMS, a następnie przejrzyj bazę danych SQLite i sprawdź, czy zmiany wprowadzone w tabelach istnieją, czy nie


1
2017-10-08 13:41



Przepraszam, bracie, myślę, że nie rozumiesz właściwie mojego pytania. Chcę przetestować moją nowszą wersję bazy danych przed przesłaniem pliku APK do sklepu Play jako nowej wersji aplikacji. - Maulik
Tak, to próbuję ci powiedzieć, po wprowadzeniu zmian w tabelach bazy danych i przed przesłaniem do gry, skorzystaj z przeglądarki sqlite, aby sprawdzić, czy twoja nowa zmieniona baza danych działa, czy też nie. - Maulik Sheth
Mam już wtyczki menedżera sqlite dla Firfox. I już testowałem z menadżerem sqlite, ale nie można wywołać mojej metody onupgrade (), więc nie można utworzyć nowej tabeli po aktualizacji bazy danych. - Maulik
Dzięki za link do dodania wtyczek do zaćmienia. Przetestowałem bazę danych z wtyczkami firefox dla menedżera sqlite. Rozwiązałem ten problem, sprawdź moją odpowiedź poniżej. W każdym razie dzięki za odpowiedź. - Maulik


Możesz zainstalować apk z innego źródła niż Playstore (jeśli jest włączony w twoim telefonie). Najprostszym sposobem, aby wysłać go do telefonu przez e-mail lub skopiować plik APK za pomocą kabla USB.


1
2017-10-08 13:45