2010-12-21 12 views
11

Estoy haciendo un cliente de mensajería instantánea para Android y estoy trabajando con bases de datos para almacenar los contactos y otra información ... En mi aplicación tengo una actividad y un servicio. Necesito abrir tres bases de datos al mismo tiempo, tanto en el servicio como en la actividad.Android bases de datos múltiples abiertas

Uso tres bases de datos porque deseo que las bases de datos se administren más fácilmente sin tener problemas con la sincronización de la escritura en ellas. (hasta donde sé, necesito escribir en la base de datos de forma sincrónica porque puede aplastar).

Para gestionar las bases de datos del servicio y de la actividad en el mismo tiempo, pensé que un único o una clase estática de DatabaseHelper me podían ayudar ...

Así que he empezado a hacer una prueba de haciendo dos objetos globales de databasehelper en la actividad, cada uno abre una base de datos diferente, después de ejecutar el proyecto he notado que la última base de datos abierta permanece abierta en ambos objetos: (,, ¿por qué ocurre esto?

¿Alguien puede sugerir ¿Cómo puedo hacer que esto funcione? ¡Gracias!

L .E .: después de más pruebas, hice un objeto estático de databasehelper, abrí un servicio del cual tomo el objeto de base de datos de la actividad y al mismo tiempo hice dos para declaraciones, una en actividad y una en servicio que se ejecutan desde 0 a 3000 y agrega algunos valores en la misma base de datos y luego lee la base de datos.

Después de esta ejecución, noté que la base de datos todavía está en pie y funcionando sin errores. Lo extraño es que el servicio se ejecuta solo después de la actividad para finalizar el trabajo. ¿Porqué es eso? ¡Gracias!

+0

Tal vez, usted trabajó con la base de datos desde el hilo principal en la actividad y en el servicio. –

Respuesta

24

Tengo una clase DatabaseAdapter que contiene dos bases de datos que se abren juntas.

public class DatabaseAdapter { 
    /** Identifier for the internal database */ 
    public static final int    INTERNAL   = 0; 
    /** Identifier for the external database */ 
    public static final int    EXTERNAL    = 1; 

    private final SQLiteOpenHelper[] mDatabaseManager = new SQLiteOpenHelper[2]; 
    private final SQLiteDatabase[]  mDatabases   = new SQLiteDatabase[2]; 

    /** 
    * Constructs the database and open it. 
    */ 
    public DatabaseAdapter() { 
     // Open the internal_db 
     mDatabaseManager[INTERNAL] = new InternalDatabaseManager(MyApplication.getInstance()); 
     mDatabases[INTERNAL] = mDatabaseManager[INTERNAL].getWritableDatabase(); 
    } 

    /** 
    * Checks the database state and throws an {@link IllegalStateException} if database isn't open. 
    * Should always be used before starting to access the database. 
    * 
    * @param type Type of the database. Can be INTERNAL or EXTERNAL. 
    */ 
    public void checkDbState(int type) { 
     if (mDatabases[type] == null || !mDatabases[type].isOpen()) { 
      throw new IllegalStateException("The database has not been opened"); 
     } 
    } 

    /** 
    * Closes the database of the given type. 
    * 
    * @param type Type of the database. Can be INTERNAL or EXTERNAL. 
    */ 
    public void close(int type) { 
     if (mDatabases[type].isOpen()) { 
      mDatabases[type].close(); 
      mDatabases[type] = null; 
      if (mDatabaseManager[type] != null) { 
       mDatabaseManager[type].close(); 
       mDatabaseManager[type] = null; 
      } 
     } 
    } 

    /** 
    * @param type Type of the database. Can be INTERNAL or EXTERNAL. 
    * @return true if the database is open, false otherwise. 
    */ 
    public boolean isOpen(int type) { 
     return mDatabases[type] != null && mDatabases[type].isOpen(); 
    } 

    /** 
    * Opens the default database. 
    * 
    * @param type Type of the database. Can be INTERNAL or EXTERNAL. 
    */ 
    public void open(int type) { 
     switch (type) { 
      case INTERNAL: 
       mDatabaseManager[INTERNAL] = new InternalDatabaseManager(MyApplication.getInstance()); 
       if (!isOpen(INTERNAL)) { 
        mDatabases[INTERNAL] = mDatabaseManager[INTERNAL].getWritableDatabase(); 
       } 
      break; 
      case EXTERNAL: 
       mDatabaseManager[EXTERNAL] = new ExternalDatabaseManager(MyApplication.getInstance(), Constants.EXTERNAL_DB_PATH, 1); 
       if (!isOpen(EXTERNAL)) { 
        mDatabases[EXTERNAL] = mDatabaseManager[EXTERNAL].getWritableDatabase(); 
       } 
      break; 
     } 
    } 
} 

para añadir un tercero debe ser fácil :)

+0

Gracias por su respuesta, voy a probar su base de datos de Helper también. – Cata

+0

No creo que sea posible pero, ¿podría abrir ambas bases de datos al mismo tiempo? –

+1

@ JuanJoséMeleroGómez seguro que sí. Solo necesita llamar a open() con un parámetro interno y externo. Como se indicó en la primera oración: Esta clase se usó para tratar con dos bases de datos al mismo tiempo, manteniendo ambas abiertas. – WarrenFaith

Cuestiones relacionadas