2011-03-10 16 views
5

Tengo una base de datos sqlite en mi aplicación. Mi aplicación no debe enviar esto como una base de datos vacía, pero se deben crear ciertos registros antes de que el usuario pueda usar la aplicación por primera vez. Por supuesto que puedo tener muchas declaraciones insertadas, pero eso parece ser muy extraño. Pensé en algo como http://vineetyadav.com/tutorials/11-adding-prefilled-sqlite-database-to-android-app.html, que básicamente funciona, pero eso significa que mi base de datos creada manualmente también necesita todas las tablas internas, como android_metadata. Entonces, necesito saber qué tablas internas existen y cómo llenarlas. Otra forma inteligente de tener una base de datos precargada. ¿Alguna sugerencia?android pre-fill sqlite database

Gracias, A.

+1

¿Por qué no utiliza SQLiteOpenHelper para obtener su conexión a la base de datos, y anula su método 'onCreate' para completar los datos de un recurso? – user634618

Respuesta

3

Puede leer en un archivo plano desde la tarjeta SD con 1 instrucción de inserción por línea e iterar a través de ese archivo.

Aquí hay un ejemplo similar en el que leí un archivo y añadir un ContactItem a mi contact_list:

public ArrayList<ContactItem> readInputFile(Context context, String filename) { 
    String text = null; 
    BufferedReader reader = null; 
    ArrayList<ContactItem> contact_list = new ArrayList<ContactItem>(); 
    contact_list.clear(); // Clear any existing contacts when a new file is read 
    try { 
     reader = new BufferedReader(new FileReader(filename)); 
     // Repeat until EOF 
     while (((text = reader.readLine()) != null)) { 
      if (!(text.length() > 1024)) { // If we read more than 1k per line there's a problem with the input file format 
       ContactItem c = new ContactItem(text); 
       if (c.getIsValid()) { 
        // We were able to parse a well formed phone number from the last line read 
        contact_list.add(c); 
       } 
      } 
     } 
    } catch (FileNotFoundException e) { 
     Toast.makeText(context, R.string.error_fileNotFound, 1).show(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Toast.makeText(context, R.string.error_ioException, 1).show(); 
     e.printStackTrace(); 
    } finally { // EOFException (or other, but EOF is handled and most likely) 
     try { 
      if (reader != null) { 
       reader.close(); 
      } 
     } catch (IOException e) { 
      Toast.makeText(context, R.string.error_generalFailure, 1).show(); 
      e.printStackTrace(); 
     } 
    } 
    return contact_list; 
} 
1

Personalmente me acaba de hacer las instrucciones de inserción, pero yo sólo tenía 2 por lo que no parecía por encima para mí.

Si necesita conocer las tablas internas, ¿por qué no extrae la base de datos de su aplicación y la echa un vistazo con cualquier explorador de bases de datos SQLite (uso SQLite Database Browser)?

android_metadata se muestra en el navegador de la base de datos SQLite como creado por CREATE TABLE android_metadata(locale TEXT), por ejemplo.

Posiblemente inserte una declaración para asegurarse de que así es como se vería.

¿Entonces puede volver a crearlo y agregarlo fácilmente?

+0

sí y no, tome android_metadata, en mi caso solo hay mi configuración regional. Entonces necesito descubrir cómo configurarlo para estos usuarios. Supongo que sería posible. Pero todo es una especie de adivinanza que podría fallar en los dispositivos que no puedo probar. Como último recurso está bien, pero adhiérase a una especificación que preferiría ... – AndyAndroid

+0

Agregar pregunta: si tiene más de 2 entradas, ¿almacenaría los valores iniciales en una matriz y los colocaría en la base de datos o en un archivo plano o en un archivo xml? – AndyAndroid

+0

Ahh ... No lo sabía, lo siento. En cuanto a la segunda pregunta, uf, ojalá supiera cuál sería la forma más eficiente de hacerlo, pero no es así. Todavía soy un novato: mi base de datos era solo una simple lista de IP, así que es una implementación fácil. :) Mi instinto dice xml o archivo plano (posiblemente más lento que xml?) Es una buena práctica, pero no tomes mi palabra. – Klaus

1

que almacenan los datos en la res/directorio de crudo como JSON. Cuando la aplicación se abrió por primera vez, utilicé AsyncTask, leí el archivo JSON (usé la biblioteca GSON) y llené mi base de datos con él.

He intentado esto con alrededor de 1000 registros y funcionó para mí. Todavía tomó algo de tiempo, alrededor de 15-30 segundos en un emulador.

No estoy seguro si esta es la mejor manera.