Android - 从服务查询数据库

时间:2015-01-21 09:02:10

标签: android android-sqlite

我正在开发一个应用程序,其中info存储了一些database。我在new info中也得到my service但在将它们提交到我的数据库之前,我想要check if the new info I have already exists in the database or not.为此,我正在从我的服务和我查询数据库中的特定信息得到了android.database.CursorWindowAllocationException ..我用谷歌搜索了this answer。根据这个,我收到了这个错误,因为我从我的服务查询数据库。

对此有任何解决方法吗?

代码到QUERY DATABASE

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)

3 个答案:

答案 0 :(得分:3)

此错误几乎总是由于在游标结束时未关闭游标。您从服务中调用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 :(得分:1)

我认为发生此问题是因为您没有close您的Cursor对象。一旦您完成使用它,您应该在服务中close,并且问题不会持久。

答案 2 :(得分:1)

这是因为一旦光标的任务完成,光标就不会关闭。 无论何时打开光标,光标都需要一个内存,如果你没有关闭它,它会占用更多的内存。 如果你检查错误

  

“Open Cursors = 762(此proc = 762打开的#游标)”

表示代码中的打开游标是762 而且就所有而言,它将需要记忆。 如果不需要,请关闭游标。

就像你的情况一样特别适用于你在循环数据后将其作为代码发布的方法

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