Utilización de la base de datos legible y escrita de SQLite

Estoy escribiendo un código para Android que requerirá tanto de Readable y Writable Database de Database al mismo tiempo. Y estoy recibiendo error de seguimiento:

 05-21 13:27:47.079: E/SQLiteDatabase(8326): close() was never explicitly called on database '/data/data/com.example.devicecontrolpanel/databases/AlarmSystem' 05-21 13:27:47.079: E/SQLiteDatabase(8326): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:2052) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1087) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1050) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1136) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1041) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at com.example.devicecontrolpanel.DataBaseAdapter.addDeviceOnSearch(DataBaseAdapter.java:215) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at com.connection.DeviceInformation.<init>(DeviceInformation.java:39) 05-21 13:27:47.079: E/SQLiteDatabase(8326): at com.example.devicecontrolpanel.TestActivity$DeviceSearcher$3.run(TestActivity.java:251) 

El pedazo de código que hace error, como por lo que estoy adivinando está aquí:

  public int addDeviceOnSearch(DeviceInformation device) //Final and done { SQLiteDatabase dbRead = this.getReadableDatabase(); String[] columDevice = {DEVICE_ID, DEVICE_NAME, DEVICE_IP, DEVICE_TYPE}; String[] columPin = {PIN_ID, PIN_NO, PIN_NAME, PIN_CURRENT_STATUS}; Cursor cursorDevice = dbRead.query(DEVICE_TABLE, columDevice, DEVICE_MAC+"=?", new String[] {device.getMAC()}, null, null, null); dbRead.close(); if(cursorDevice==null) { SQLiteDatabase dbWrite = this.getWritableDatabase(); ContentValues values = new ContentValues(); //New Device values.put(DEVICE_IP, device.getIP()); values.put(DEVICE_MAC, device.getMAC()); values.put(DEVICE_NAME, device.getDeviceName()); values.put(DEVICE_TYPE, device.getType()); long devId = dbWrite.insert(DEVICE_TABLE, null, values); device.setId((int) devId); dbWrite.close(); } else { 

Error en esta línea Línea No. 215

  SQLiteDatabase dbWrite = this.getWritableDatabase(); 

Error en esta línea Línea No. 215

  ContentValues values = new ContentValues(); //Already Exist device.setId(Integer.parseInt(cursorDevice.getString(0))); device.setDeviceName(cursorDevice.getString(1)); values.put(DEVICE_IP, device.getIP()); values.put(DEVICE_TYPE, device.getType()); dbWrite.update(DEVICE_TABLE,values, DEVICE_ID+ " = ?",new String[] {String.valueOf(device.getId())}); values = new ContentValues(); dbWrite.close(); dbRead = this.getReadableDatabase(); Cursor cursorPin = dbRead.query(PIN_TABLE, columPin, PIN_DEVICE_ID+"=?", new String[] {String.valueOf(device.getId())}, null, null, null); if(cursorPin==null) { device.setDevicePin(null); } else { cursorPin.moveToFirst(); List<DevicePinDetail> devicePins = new ArrayList<DevicePinDetail>(); do { int pinId=Integer.parseInt(cursorPin.getString(0)); int pin_no=Integer.parseInt(cursorPin.getString(1)); String PinName =cursorPin.getString(2); int pinStatus=Integer.parseInt(cursorPin.getString(3)); int PinDeviceId=device.getId(); devicePins.add(new DevicePinDetail(pinId, pin_no, PinName, PinDeviceId, pinStatus)); }while(cursorPin.moveToNext()); device.setDevicePin(devicePins); } } dbRead.close(); return device.getId(); } 

onCreate ()

 @Override public void onCreate(SQLiteDatabase db) { String CREATE_ALARM_TABLE = "Create Table "+TABLE_NAME+"(" +KEY_ALARM_ID+" integer primary key AUTOINCREMENT, "+KEY_DESC+" TEXT, "+KEY_REPEAT_DAY+ " TEXT," +KEY_REPEAT_TYPE+" integer, "+KEY_CALENDAR+" TEXT, "+KEY_DEVICE_MAC+" TEXT,"+KEY_DEVICE_IP+" TEXT," +KEY_DEVICE_TYPE+" integer, "+KEY_JSON+" TEXT,"+KEY_ACTIVE+" integer, "+KEY_DEVICE_NAME+" text);"; String CREATE_DEVICE_TABLE = "Create Table "+ DEVICE_TABLE+"(" +DEVICE_ID+" integer primary key AUTOINCREMENT, "+DEVICE_MAC+" TEXT, "+DEVICE_NAME+" text, "+DEVICE_IP+" TEXT,"+DEVICE_TYPE+" integer);"; String CREATE_PIN_TABLE = "Create Table "+ PIN_TABLE + "(" +PIN_ID+" integer primary key AUTOINCREMENT, "+PIN_NO+" integer, "+PIN_NAME+" text, "+PIN_CURRENT_STATUS+" integer, " +PIN_DEVICE_ID+" integer);"; String CREATE_SETTING_TABLE = "Create Table "+SETTINGS_TABLE+" (" +SETTINGS_ID+" integer primary key AUTOINCREMENT, " +SETTINGS_COMPUTER+" integer, "+SETTINGS_RASPBERRY+ " integer, "+SETTINGS_FLYPORT+ " integer," +COMPUTER_IP + " text,"+COMPUTER_PORT_SEND+" integer, "+RASPBERRY_IP+" text,"+RASPBERRY_PORT_SEND+" integer," + " text,"+COMPUTER_PORT_RECV+" integer,"+RASPBERRY_PORT_RECV+" integer);"; db.execSQL(CREATE_PIN_TABLE); db.execSQL(CREATE_ALARM_TABLE); db.execSQL(CREATE_DEVICE_TABLE); db.execSQL(CREATE_SETTING_TABLE); ContentValues values = new ContentValues(); values.put(SETTINGS_COMPUTER, 1); values.put(SETTINGS_RASPBERRY, 1); values.put(SETTINGS_FLYPORT, 1); values.put(COMPUTER_IP, "225.4.5.6"); values.put(RASPBERRY_IP, "225.4.5.6"); values.put(COMPUTER_PORT_SEND, 5000); values.put(COMPUTER_PORT_RECV, 5003); values.put(RASPBERRY_PORT_SEND, 6000); values.put(RASPBERRY_PORT_RECV, 6003); db.insert(SETTINGS_TABLE, null, values); System.out.println("Values added"); } 

Si necesita leer y escribir la misma base de datos, le sugiero que abra la base de datos una vez en modo de escritura. También se puede leer la base de datos de escritura, por lo tanto, no debería tener ningún problema para hacer todo lo que necesita. De acuerdo con la documentación getWritableDatabase , este método se utiliza para

Crear y / o abrir una base de datos que se utilizará para leer y escribir.

Por lo tanto no hay necesidad de abrirlo dos veces en dos modos separados. Ábralo una vez como escribible, haga todo lo que usted necesita hacer, después ciérrelo.

Vea si desea evitar este problema hay un par de cosas aquí Uno Ya que su base de datos tiene múltiples conexiones no son serializadas o bloqueo es buggy por lo que si accede a su base de datos de múltiples hilos y con diferentes conexiones por lo que si un hilo está escribiendo bloqueos el archivo db y cualquier puesto de operaciones que fallará Así que para que funcione use

  1. Modo WAL en SQLLite en el que puede tener una operación de escritura y lecturas concurrentes dependiendo de los hilos
  2. Mantenga una instancia simple o única de DB para que todas las operaciones en una conexión compartida a través de múltiples subprocesos sean serializadas
  • Esquema de etiqueta para una aplicación de Android
  • Depuración de la base de datos sqlite en el dispositivo
  • Android SQLite select * de la tabla donde nombre como% key% usando instrucciones preparadas
  • ¿Los campos de datos SQLite null ocupan más memoria?
  • GetWritableDatabase () VS getReadableDatabase ()
  • La restricción UNIQUE falló: base de datos sqlite: android
  • ORM en Android SQLite y esquema de base de datos
  • Descargar la base de datos SQLite desde Internet y cargarla en la aplicación de Android
  • BroadcastReceiver para SMS de varias partes
  • Close () nunca fue explícitamente llamado en Android y SQlite
  • Sugar ORM No hay tal tabla de excepción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.