5

Sto creando un'app Kiosk che utilizza il database. L'app è in esecuzione sempre in primo piano. L'app ha molti thread che utilizzano un'istanza DataBaseHelper condivisa. l'applicazione funziona perfettamente, ma il più delle volte dopo 5 o 6 ore al giorno, ho incontrato queste eccezioni poi si blocca app:L'allocazione della finestra del cursore di 2048 kb non è riuscita. # Cursori aperti = 1 (# cursori aperti da questo proc = 1)

E/DataBaseHelper: allocazione finestra Cursore di 2048 kb riuscita. # Aperte cursori = 1 (# cursori aperti da questo proc = 1)

E/CursorWindow: Impossibile allocare CursorWindow '/data/user/0/com.kios.frm/databases/YadProjectDB.db' di dimensioni 2097152 a causa dell'errore -24.

E/SQLiteLog: (14) impossibile aprire il file in linea 30192 di [00bb9c9ce4]

E/SQLiteLog: (14) Dichiarazione interrompe a 16: [numero SELECT FROM sms LIMITE 5] in grado di aprire il database file

E/SQLiteQuery: eccezione: impossibile aprire il file di database (codice 14);
query: SELECT FROM numero sms LIMITE 5

E/SQLiteLog: (14) os_unix.c: 30192: (24)
aperta (/data/user/0/com.kiosk.frm/databases/YadProjectDB .db-journal) -

Ho chiuso il cursore correttamente ma ottenendo comunque quelle eccezioni. quali sono queste eccezioni? qual è la causa di queste eccezioni? Metodo

MainActivity

private DataBaseHelper db = null; // Global  

MainActivity onCreate: classe

db = new DataBaseHelper(this); 

new Thread(new Runnable() { 
@Override 
public void run() { 
    while (threadRunningFlag) { 

    Cursor result = null; 
    try { 

     result = db.getData("SELECT " + DataBaseHelper.SMS_COLUMN_PHONE_NUMBER + " FROM " + DataBaseHelper.SMS_TABLE_NAME + " LIMIT 5"); 
     if (result != null && result.getCount() > 0) { 
      while (!result.isAfterLast()) { 
       String phoneNumber = result.getString(result.getColumnIndex(DataBaseHelper.SMS_COLUMN_PHONE_NUMBER)); 
       // ... 
       result.moveToNext(); 
      } 
     } 
    }catch (Exception e) { 
     Log.e(TAG, "err->" + e.getLocalizedMessage()); 

    }finally { 
     if (result != null) { 
      result.close(); 
      result = null; 
     } 
    } 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      Log.e(TAG, e.getMessage()); 
     } 
    } 
} 
}).start(); 

DataBaseHelper:

public class DataBaseHelper extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "YadProjectDB.db"; 
    public static final String SMS_TABLE_NAME = "sms"; 
    public static final String SMS_COLUMN_PHONE_NUMBER = "number"; 
    public static final String SMS_COLUMN_SMS_TEXT = "message"; 

    public static final String BLACK_LIST_TABLE_NAME = "blackList"; 
    public static final String BLACK_LIST_COLUMN_ID = "id"; 
    public static final String BLACK_LIST_COLUMN_PHONE_NUMBER = "number"; 

    private final String TAG = "DataBaseHelper"; 

    public DataBaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String command = "CREATE TABLE " 
       + SMS_TABLE_NAME 
       + "(" 
       + SMS_COLUMN_PHONE_NUMBER + " TEXT," 
       + SMS_COLUMN_SMS_TEXT + " TEXT," 
       + ")"; 
     try { 
      db.execSQL(command); 
     }catch (Exception e) { 
      Log.e(TAG, "err->" + e.getMessage()); 
     } 

     command = "CREATE TABLE " 
       + BLACK_LIST_TABLE_NAME 
       + "(" 
       + BLACK_LIST_COLUMN_PHONE_NUMBER + " TEXT," 
       + ")"; 
     try { 
      db.execSQL(command); 
     }catch (Exception e) { 
      Log.e(TAG, "err->" + e.getMessage()); 
     } 
    } 

    public boolean insertToSms(String number, String message, String fileName, Integer uploadFlag, Integer blackList, Integer pictureFlag) 
    { 
     final SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(SMS_COLUMN_PHONE_NUMBER, number); 
     contentValues.put(SMS_COLUMN_SMS_TEXT, message); 
     try { 
      db.insert(SMS_TABLE_NAME, null, contentValues); 
      return true; 
     }catch (Exception e) { 
      Log.e(TAG, "err->" + e.getMessage()); 
      return false; 
     } 
    } 

    public Cursor getData(String query){ 
     final SQLiteDatabase db = getReadableDatabase(); 
     Cursor res = null; 
     try { 
      res = db.rawQuery(query, null); 
      res.moveToFirst(); 
      return res; 
     }catch (Exception e) { 
      Log.e(TAG, "err->" + e.getMessage()); 
      if (res != null) { 
       res.close(); 
       res = null; 
      } 
     } 
     return null; 
    } 
} 
+0

che cosa esattamente si vuole raggiungere? – pskink

+1

causa di tali eccezioni e trova il problema – exshinigami

+0

ok, perché continui a scorrere sul Cursore? – pskink

risposta

8

Questo è sembra lo stesso problema come SQLite Android Database Cursor window allocation of 2048 kb failed

Il tuo errore dice: "cursori aperti"

La risposta nella domanda di cui sopra spiega:

Molto spesso la causa di questo errore sono non cursori chiusi. Assicurati che chiudi tutti i cursori dopo averli utilizzati (anche in caso di errore).

Cursor cursor = null; 
try { 
    cursor = db.query(... 
    // do some work with the cursor here. 
} finally { 
    // this gets called even if there is an exception somewhere above 
    if(cursor != null) 
     cursor.close(); 
} 
+0

Come puoi vedere Sto chiudendo correttamente il Cursore – exshinigami

+1

E che dire dei Cursori in altri punti della tua applicazione? Potresti farli fuoriuscire altrove. –

+0

Sto usando lo stesso codice in altri thread ma con logica diversa. che dire di altre eccezioni? – exshinigami