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? |
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. |
Pa pazi, kol'ko sam video SQLite ne podržava extended upite
Citat:
|
|
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) { |
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 :D |
Pročitao sam da postoji limit od 1MB po fajlu koji može da se otvori, jel' ti baza veća od toga?
|
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:
|
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. |
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> |
Samo sam promenio ekstenziju db fajla u "jet" (zvuči "kul" a jedna je od ekstenzija koje se ne kompresuju u APK-u) i to za sad radi, mogu da iskopiram bazu i da čitam iz nje (a verujem i da se štedi vreme koje bi bilo potrošeno na unos 70k redova). Videću kako se ponaša pa ako bude problema probaću da splitujem kao što je objašnjeno na linku koji si ostavio.
Hvala još jednom :) edit: Srđane, ni 3GP se ne kompresuje, zato možeš da ga pročitaš. Baci pogled na link koji sam ostavio ranije (ponystyle.com), tamo ima spisak ekstenzija koje se ne kompresuju. |
Interesantno... ovaj moj APK je manji za mrvu od zbira resursa jer ima još par fajlova koji nisu 3GP, sad pogledah, stvarno je isti u bajt... čovek se uči dok je živ. :)
A sad postupi po osnovnom pravilu, "ako radi ne diraj" ;) |
Vreme je GMT +2. Trenutno vreme je 22:41. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.