sql >> Databasteknik >  >> RDS >> SQLite

SQLite-minnesproblem med singleton-metoden

Om du får ett meddelande som indikerar att för många filer är öppna, kan en orsak vara att det finns för många markörer som fortfarande är öppna.

Meddelandet som returneras kanske inte alltid är detsamma och är förmodligen specifikt för uppgiften/samtalet som anropas.

I det här fallet var meddelandet (unable to open database file (code 2062)) , ännu i ett annat fall (från en SELECT kunde meddelandet unable to open database file (code 14) ). SQLite kan inte öppna databasfil (kod 14) vid frekvent "SELECT"-fråga.

Ovanstående länk pekar också på ett inlägg jag gjorde som ganska tydligt visar att att skapa en markör resulterar i att en fil (eller filer) öppnas.

Exemplet gick igenom cirka 500 rader och för varje rad skapades/återskapades 3 markörer för varje rad (så potentiellt 1500+ markörer även om man bara använder 4 markörobjekt).

Inledningsvis stängde det bara de 3 markörerna i slutet (sista raden av föräldern av alla) vilket resulterade i unable to open database File (code 14) . Att stänga de 3 markörerna för varje iteration löste problemet.

Koden som misslyckades var :-

        SQLiteDatabase db = getWritableDatabase();
        Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
        Cursor productcsr;
        Cursor aislecsr;
        Cursor prdusecsr;
        while(shoplistcursor.moveToNext()) {
            productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
            prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
                    shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
                deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
            } 
            if(shoplistcursor.isLast()) {
                prdusecsr.close();
                aislecsr.close();
                productcsr.close();
            }
        }
        shoplistcursor.close();
        db.close();
}

Medan den fasta koden var :-

        SQLiteDatabase db = getWritableDatabase();
        Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
        Cursor productcsr;
        Cursor aislecsr;
        Cursor prdusecsr;
        while(shoplistcursor.moveToNext()) {
            productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
            prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
                    shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
            if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
                productcsr.close();
                aislecsr.close();
                prdusecsr.close();
                deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
            } else {
                productcsr.close();
                aislecsr.close();
                prdusecsr.close();
            }
        }
        shoplistcursor.close();
        db.close();
    }

Jag tenderar nu att följa följande regel/praxis:-

  • Om man bara får resultatet t.ex. för att få antalet rader, stäng markören i metoden.

  • Om du använder markören för en visning, t.ex. en ListView, stäng sedan markören i aktivitetens onDestroy metod.

  • Om du använder markören för vad jag kallar mer komplex bearbetning, t.ex. ta bort rader med underliggande referenser och stäng sedan markörerna så snart de är klara, inom bearbetningsslingan/slingorna.



  1. SQL SELECT AND Operator

  2. Förstå SQL Server alltid krypterad

  3. Hur man exporterar data till platt fil med BCP Utility och importerar data med Bulk Insert

  4. Stöder SQLDeveloper exekvering av skript?