Ciao ragazzi io devo inserire nella mia applicazione android circa 18000 righe da inserire nel db. E' possibile creare direttamente il file sqlite e poi darlo in pasto al programma? Grazie a tutti
Ciao ragazzi io devo inserire nella mia applicazione android circa 18000 righe da inserire nel db. E' possibile creare direttamente il file sqlite e poi darlo in pasto al programma? Grazie a tutti
Ecco l'errore
Too many constants, the constant pool for NomeClasse would exceed 65536 entries.
Ora come faccio a passargli tutte quelle istruzioni sql? Qualcuno sa aiutarmi?
Posta il codice e una spiegazione di cosa devi fare.
package francesco.Indirizzario;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class GenericDAO extends SQLiteOpenHelper {
private static final String DB_NAME = "Cartoline";
private static final int DB_VERSION = 4;
public GenericDAO(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//Creazione delle tabelle
//Crea la tabella con le nazioni
String sql = "";
sql += "CREATE TABLE T_Nazioni (";
sql += " _id INTEGER PRIMARY KEY,";
sql += " CodNazione TEXT NOT NULL,";
sql += " Descrizione TEXT NOT NULL";
sql += ");";
db.execSQL(sql);
//Crea la tabella con le città
sql = "";
sql += "CREATE TABLE T_Citta (";
sql += " _id INTEGER PRIMARY KEY,";
sql += " CodNazione TEXT NOT NULL,";
sql += " Id_Citta INTEGER NOT NULL,";
sql += " Descrizione TEXT NOT NULL";
sql += ");";
db.execSQL(sql);
//Crea la tabella con le vie
sql = "";
sql += "CREATE TABLE T_Vie (";
sql += " _id INTEGER PRIMARY KEY,";
sql += " CodNazione TEXT NOT NULL,";
sql += " Id_Citta INTEGER NOT NULL,";
sql += " Id_Via INTEGER NOT NULL,";
sql += " Descrizione TEXT NOT NULL,";
sql += " CAP TEXT NOT NULL";
sql += ");";
db.execSQL(sql);
//creo la tabella per i messaggi delle cartoline
sql = "";
sql += "CREATE TABLE T_Messaggi (";
sql += " _id INTEGER PRIMARY KEY,";
sql += " Categoria TEXT NOT NULL,";
sql += " Messaggio TEXT NOT NULL,";
sql += " Lingua TEXT NOT NULL";
sql += ");";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {
// Aggiornamento delle tabelle
//Inserisco i dati delle nazioni
String sql;
sql="DELETE FROM T_Nazioni;";
db.execSQL(sql);
sql="DELETE FROM T_Citta;";
db.execSQL(sql);
sql="DELETE FROM T_Vie;";
db.execSQL(sql);
sql="DELETE FROM T_Messaggi;";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Nazioni(CodNazione,Descrizione)VALUES('IT','ITAL IA');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Nazioni(CodNazione,Descrizione)VALUES('GR','GREC IA');";
db.execSQL(sql);
//Inserisco i dati delle città
sql = "";
sql += "INSERT INTO T_Citta(CodNazione,Id_Citta,Descrizione)VALUES('IT ',1,'ROMA');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Citta(CodNazione,Id_Citta,Descrizione)VALUES('IT ',2,'MILANO');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Citta(CodNazione,Id_Citta,Descrizione)VALUES('IT ',3,'ROSSANA');";
db.execSQL(sql);
//Inserisco i dati delle vie
sql = "";
sql += "INSERT INTO T_Vie(CodNazione,Id_Citta,Id_Via,Descrizione, Cap)VALUES('IT',1,1,'Via ROMA','11111');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Vie(CodNazione,Id_Citta,Id_Via,Descrizione, Cap)VALUES('IT',1,2,'Via ROMA2','11112');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Vie(CodNazione,Id_Citta,Id_Via,Descrizione, Cap)VALUES('IT',2,1,'Via Milano','21111');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Vie(CodNazione,Id_Citta,Id_Via,Descrizione, Cap)VALUES('IT',2,2,'Via Milano2','21112');";
db.execSQL(sql);
sql = "";
sql += "INSERT INTO T_Vie(CodNazione,Id_Citta,Id_Via,Descrizione, Cap)VALUES('IT',3,1,'Paese intero','12020');";
db.execSQL(sql);
sql="INSERT INTO T_Messaggi(Categoria,Messaggio,Lingua)VALUES('CORD IALI','Ciao NomeCognome come stai?','IT');";
db.execSQL(sql);
sql="INSERT INTO T_Messaggi(Categoria,Messaggio,Lingua)VALUES('CORD IALI','Ciao NomeCognome sarebbe bello fossi qui con noi.','IT');";
db.execSQL(sql);
sql="INSERT INTO T_Messaggi(Categoria,Messaggio,Lingua)VALUES('SIMP ATICHE','Ma va a morir ammazzato...','IT');";
db.execSQL(sql);
}
}
Questo è un esempio. Ma quando sono andato ad inserire i dati reali (che sono mooolti) mi ha dato l'errore sopra menzionato. Penso sia solo un problema di quanti record vado ad inserire però vorrei capire come fare ad aggirarlo.
Carica i dati dentro il db DA PC, poi inserisci il db già caricato dentro la tua applicazione sul dispositivo
Ultima modifica di TheCopacabanaMan; 21-03-11 alle 17:08
1) scarica il programma Sqlite3.exe da qui: SQLite Version 3 Overview
2) su PC, crea un bel file il_mio_bel_db.sql E' un file di testo, dove metterai i tuoi MilleMila comandi di: create table, insert into my beautiful table, etc.
3) su PC, attraverso Sqlite3.exe, infila il file il_mio_db.sql dentro il tuo database il_mio_bel_db.db con questo comando DOS:
4) copia il file il_mio_bel_db.db dentro il progetto eclipse, nella sottodirectorycodice:sqlite3.exe il_mio_bel_db.db < il_mio_bel_db.sql
il_mio_bel_programma\res\raw\il_mio_bel_db.db
(hai creato le sottodirectory res\raw\ vero?)
5) da codice java, quando fai partire il programma la prima volta, puoi inserire questo codice:
Ehi! Solo la prima volta, ho detto! Altrimenti inizializzi il DB ogni volta che lanci il programma.codice:public void Copy_DB() throws IOException{ // databaseInput punta al nostro file il_mio_bel_db.db InputStream databaseInput = null; // db_name e' il nome del db proprietario dell'applicazione db_name = context.getApplicationInfo().dataDir + "/databases/il_mio_bel_db.db"; String outFileName = db_name; OutputStream databaseOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; databaseInput = context.getResources().openRawResource( com.il_mio_bel_programma.raw.data ); while((length = databaseInput.read(buffer)) > 0) { databaseOutput.write(buffer, 0, length); databaseOutput.flush(); } databaseInput.close(); databaseOutput.flush(); databaseOutput.close(); }
P.S. per la consulenza, mi devi un gelato!![]()
Ci sono anche estensioni gratuite per i browser come Chrome o Firefox che ti permettono di modificare/creare database SQLite. L'unica cosa devi stare attento ad utilizzare la giusta versione, so che in Gingerbread il motore è stato aggiornato (tanto che non potevo più aprire i backup di MyBackup Pro in quanto diceva esser corrotti)... e sinceramente non so che versioni utilizzino le varie versioni di Android.
In ogni caso considera il fatto che se ti dice che ci sono 6000 e rotti dati di troppo, è molto probabile che sia un limite in dimensioni del database, piuttosto che una quantità sopra il limite di query.
Grazie a tutti vi farò sapere prossimamente come è andata.![]()