|
Programiranje Java, Perl, VB, ASP, .NET, C, C++, Pascal, Delphi Sponzor: |
|
Alati teme | Način prikaza |
05. 02. 2011. | #1 |
emperor Selassie
Grand Master
|
JAVA [Android] - Distribucija baze uz aplikaciju
Pravim neku aplikaciju za Android i trebalo bi da uz nju distribuiram i (SQLite) bazu sa jednom tabelom i ~70000 redova u njoj. Problem je što nigde ne mogu da nađem neki sistem za distribuciju gotove (popunjene) baze uz aplikaciju.
Naišao sam na ovo uputstvo, gde praktično kažu da dump-ujemo bazu i da je iskopiramo u assets/ folder našeg projekta, a onda sa kodom sa ovog linka da je iskopramo na Android, tamo gde treba da stoji. Ali meni ovaj kod ne radi, puca u while petlji koja kopira fajl (IOException). Druga ideja koja mi pada na pamet jeste da distribuiram podatke u nekom csv/txt formatu, a onda pri prvom pokretanju aplikacije da kreiram bazu i da je popunim podacima iz csv/txt fajla, ali ovo nisam probao i nisam siguran koliko će dugo trajati to popunjavanje tabela, mada džaba kukam kad nisam ni probao (još). Pa pre nego što probam ovo drugo, voleo bih da čujem iskustva drugih (ako ih ima), odnosno kako ste vi rešili distribuiranje (veće količine) podataka uz Android aplikaciju? |
05. 02. 2011. | #2 |
xyz
Grand Master
Datum učlanjenja: 25.10.2006
Poruke: 893
Hvala: 87
346 "Hvala" u 163 poruka
|
Exportuješ bazu u SQL formatu (INSERT...), staviš taj veliki string u asset.
Kod starta aplikacije po prvi put kad kreiraš tabele u bazi, učitaš string i izvršiš ga. Sigurno je brže od parsiranja CSV/TXT. |
05. 02. 2011. | #3 | |
emperor Selassie
Grand Master
|
Pa pazi, kol'ko sam video SQLite ne podržava extended upite
Citat:
|
|
05. 02. 2011. | #5 |
xyz
Grand Master
Datum učlanjenja: 25.10.2006
Poruke: 893
Hvala: 87
346 "Hvala" u 163 poruka
|
Za početak, trebao bi da koristiš execSql()
rawQuery je za upite (SELECT) Kad učitaš bazu, možeš da i uradiš ovako nešto: Kôd:
void execMultipleSQL(SQLiteDatabase db, String[] sql) { for (String s : sql) if (s.trim().length() > 0) db.execSQL(s); } .... String s = učitaj upit iz asseta String[] sql = s.split("\n"); // razbij na pojedinačne INSERT-e db.beginTransaction(); try { execMultipleSQL(db, sql); bb.setTransactionSuccessful(); } catch (SQLException e) { Log.e("Error: ", e.toString()); throw e; } finally { db.endTransaction(); } Poslednja izmena od srdjan : 05. 02. 2011. u 13:38. |
05. 02. 2011. | #6 |
emperor Selassie
Grand Master
|
Uh, to vučem iz php-a, gde je mysql_query() i za čitanje i za pisanje
Da, tako sam nešto i mislio, moram da učitam ceo fajl pa da ga splitujem i da izvršim upit po upit. Jablane, hvala, ali izgleda da je ovo što si mi ti dao isto ono što sam ja linkovao u prvoj poruci, samo malo opširnije. Meni to nije radilo. Ajde probaću svašta nešto pa ćemo da vidimo šta će da ispadne |
05. 02. 2011. | #8 | |
emperor Selassie
Grand Master
|
SQL upiti su skoro 5 MB, dok je db fajl oko 3 MB. Ako je tačno to za ograničenje po veličini fajla onda ću morati da ga cepkam na više manjih fajlova. U svakom slučaju, dobro je znati i to.
edit: U pravu si, evo ovde može da se vidi: http://ponystyle.com/blog/2010/03/26...-android-apps/ (pretposlednji pasus) Citat:
Poslednja izmena od Nemanja Avramović : 05. 02. 2011. u 18:20. |
|
05. 02. 2011. | #9 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Imaš ovde pokriven taj slučaj: http://www.chriskopec.com/blog/2010/...rge-databases/
Bojim se da bi ubacivanje 70k redova bilo jako sporo ako ideš jedan po jedan. Vidi pa javi kako si na kraju uradio.
__________________
blog |
05. 02. 2011. | #10 |
xyz
Grand Master
Datum učlanjenja: 25.10.2006
Poruke: 893
Hvala: 87
346 "Hvala" u 163 poruka
|
U poslednjoj aplikaciji koju sam radio pri prvoj instalaciji iz asseta čitam 3GP video od 20.1 MB "APK-kompresovan" na 20.0 MB i kopiram ga na SD card sa običnim read-write i to radi relativno brzo na jadnom 1.6 HTC Tattoo, tako da sigurno može da se pročita fajl od 5 MB iz asseta.
Poziv 70.000 INSERT-a je druga priča, ali neka proba pa javi... Može da proba i ovo: INSERT INTO tabela (a, b, c) SELECT <red 1> UNION ALL SELECT <red 2> UNION ALL ... UNION ALL SELECT <red 70000> Poslednja izmena od srdjan : 05. 02. 2011. u 19:20. |
|
|