2015-01-21 65 views
2

我正在研究一個應用程序,其中info存儲在database中。我得到new info以及my service,但在提交到我的數據庫之前,我想要check if the new info I have already exists in the database or not.爲此,我正在查詢數據庫中的特定信息從我的服務,我得到android.database.CursorWindowAllocationException ..我GOOGLE了它,並找到this answer。據此,我得到這個錯誤,因爲我從我的服務查詢數據庫。Android - 從服務中查詢數據庫

任何解決方法?

代碼來查詢數據庫

public String getLogData() { 
    String[] coloumns = { KEY_NETWORK_INFO }; 
    Cursor c = ourDatabase.query(LOG_TABLE_NAME, coloumns, null, null, 
      null, null, null); 
    String result = ""; 
    int iNetworkInfo = c.getColumnIndex(KEY_NETWORK_INFO); 
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
     result = result + c.getString(iNetworkInfo) + ", "; 
    } 
    return result; 
} 

logcat的:

01-21 13:43:00.633: E/AndroidRuntime(14871): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=762 (# cursors opened by this proc=762) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.CursorWindow.<init>(CursorWindow.java:108) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at com.iqra.adeel.newfyp.part1.AreaDatabase.getLogData(AreaDatabase.java:153) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at com.iqra.adeel.newfyp.part1.MyService$MyPhoneStateListener.onSignalStrengthsChanged(MyService.java:102) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.telephony.PhoneStateListener$1.handleMessage(PhoneStateListener.java:301) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.os.Handler.dispatchMessage(Handler.java:102) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.os.Looper.loop(Looper.java:135) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at android.app.ActivityThread.main(ActivityThread.java:5223) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at java.lang.reflect.Method.invoke(Native Method) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at java.lang.reflect.Method.invoke(Method.java:372) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
01-21 13:43:00.633: E/AndroidRuntime(14871): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

可能重複[2048 KB的SQLite的Android的數據庫遊標窗口分配失敗(HTTP關閉://stackoverflow.com/questions/11340257/sqlite-android-database-cursor-window-allocation-of-2048-kb-failed) – 2015-01-21 09:14:43

回答

2

該錯誤幾乎總是由於在完成時沒有關閉遊標而導致的。並且您從服務調用getLogData,因此如果遊標未關閉且應用程序繼續打開新遊標,則可能會發生此錯誤。 see here

因此,在你的代碼接近光標作爲

if (c != null) 
    c.close(); 

返回結果,即之前。重寫getLogData方法爲

public String getLogData() { 
    String[] coloumns = { KEY_NETWORK_INFO }; 
    Cursor c = ourDatabase.query(LOG_TABLE_NAME, coloumns, null, null, 
      null, null, null); 
    String result = ""; 
    int iNetworkInfo = c.getColumnIndex(KEY_NETWORK_INFO); 
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
     result = result + c.getString(iNetworkInfo) + ", "; 
    } 
    if (c != null) 
    c.close(); 
    return result; 
} 
1

我想是因爲你不close光標對象出現此問題。一旦你使用它,你應該在服務中使用close,這個問題將不會持續。

1

這是因爲一旦任務完成後,遊標不會關閉。 光標每當你打開光標時都需要一個內存,如果你沒有關閉光標,光標會產生更多的內存。 如果你檢查錯誤

「打開的遊標=(本proc等於762開#遊標)762」是指在你的代碼打開的遊標是762 併爲所有將要求記憶。 只要不需要,就關閉遊標。

像你的情況特別是對於其中U HVE張貼在THT一個代碼的方法循環的數據

if (c != null) 
    c.close();