ugrás a tartalomhoz

Android saját sqlite adatbázis használata

meni · 2013. Szep. 16. (H), 07.44
Sziasztok!

Nemrég kezdtem nézegetni az Android fejlesztést, eddig nagyon tetszik és mindent sikerült is megoldanom.
Szerettem volna saját magamnak készíteni egy teszt alkalmazást, ami egy sqlite adatbázist használ, de nem létrehozza az adatbázist, hanem egy meglévő adatbázist felmásol és megnyit, majd ezen futtat SQL lekérdezéseket. A neten elolvastam már mindent a témáról, készítettem egy sqlite adatbázist, készítettem egy teszt alkalmazást, ami fel is másolja az assets könyvtáramból az sqlite adatbázis fájlt az emulátoron belül a megfelelő helyre. (egy DataBaseHelper osztályt csináltam a doksik alapján, amiben van egy metódus, ami ha nem létezik az adatbázis fájl, akkor az assets könyvtárból odamásolja)
A gondom az, hogy az sqlite adatbázis fájl mindig üres lesz, olyan mintha mindig újra létrejönne és nem az assets könyvtárban lévőt másolná fel, nincs benne az a tábla, ami az eredetiben benne van. Eddig körülbelül 50 darab példakódot próbáltam ki, különféle helyekről, átolvastam mindent amit találtam, de nem értem, hogy mi a gond. Megköszönnék minden tanácsot olyanoktól, aki már csinált ilyet. Előre is köszönöm a válaszokat!


Ez a három metódus végzi az ellenőrzést, másolást és a megnyitást:


 /**
     * Creates a empty database on the system and rewrites it with your own
     * database.
     *
     * @throws java.io.IOException io exception
     */
    private void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if (dbExist) {
            // do nothing - database already exist
        } else {

            // By calling this method an empty database will be created into
            // the default system path
            // of your application so we are gonna be able to overwrite that
            // database with our database.
            this.getReadableDatabase();

            try {

                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");
            }
        }
    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     *
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase() {

        SQLiteDatabase checkDB = null;

        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {

            // database doesn't exist yet.

        }

        if (checkDB != null) {

            checkDB.close();

        }

        return checkDB != null;
    }

    /**
     * Copies your database from your local assets-folder to the just created
     * empty database in the system folder, from where it can be accessed and
     * handled. This is done by transfering bytestream.
     *
     * @throws java.io.IOException io exception
     */
    public void copyDataBase() throws IOException {

        // Open your local db as the input stream
        InputStream myInput = ApplicationContextProvider.getContext().getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        // 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();

    }


Köszönöm előre is a válaszokat!
 
1

Ha kézzel másolod fel, akkor

Joó Ádám · 2013. Szep. 16. (H), 14.58
Ha kézzel másolod fel, akkor működik?
2

Szia, igen, akkor minden

meni · 2013. Szep. 16. (H), 17.31
Szia,

igen, akkor minden oké. Nem nagyon értem, hogy mi lehet a baja, csak annyit látok, hogy a fájl ami létrejön az emulátoron, az jóval kisebb méretű mint az eredeti, ami az assetes könyvtáramban van. Olyan mintha mindig újat csinálna.
Azt olvastam valahol, hogy a getReadableDatabase() mindig újra létrehozza az adatbázist, de szerintem ez nem igaz.
Igazából már ötletem sincs mi lehet a baja, az egész hétvégén ezzel játszottam otthon, de egyszerűen már nincs ötletem, végigpróbáltam a neten fellelhető összes példakódot, de egyik sem működött.
3

assets

Poetro · 2013. Szep. 16. (H), 18.43
Nem lehet, hogy nem a megfelelő fájl van az assets-hez adva? Mármint leellenőrízted az asset méretét még olvasás előtt? Ahogy olvastam, valahogy hozzá kell adni az assets listához, nem elég ha a folderban van.
4

Köszönöm, hogy megemlítetted

meni · 2013. Szep. 16. (H), 21.41
Köszönöm, hogy megemlítetted az assets listát :) Bár nem kellett hozzáadni semmilyen listához, de az ötleted alapján megtaláltam a megoldást.

Ha esetleg másoknak is ilyen gondja lenne, akkor keresse meg a saját projekt könyvtárán belül a PROJEKT_NEVE.iml fájlt és ebben nézze meg, hogy mi az ASSETS_FOLDER_RELATIVE_PATH környezeti változó értéke. Nálam ez más volt mint ahová létrehoztam az assets könyvtáramat, ezért az android nem találta a fájlt és létrehozott egy üres adatbázist. :)

Köszi!
5

Azt olvastam valahol, hogy a

smithdevil1 · 2015. Jan. 24. (Szo), 13.42
Azt olvastam valahol, hogy a getReadableDatabase() mindig újra létrehozza az adatbázist, de szerintem ez nem igaz.
Igazából már ötletem sincs mi lehet a baja, az egész hétvégén ezzel játszottam otthon