Android - 从服务查询数据库

标签 android android-sqlite

我正在开发一个应用程序,其中我有一些 info 存储在 database 中。我也在 my service 中获得了 new info 但在将它们提交到我的数据库之前,我想 检查新信息是否已经存在于 为此,我在数据库中查询来 self 的服务的特定信息,我得到了 android.database.CursorWindowAllocationException.. 我用谷歌搜索并找到了 this answer .据此,我收到该错误是因为我正在从我的服务中查询数据库。

有什么解决方法吗?

查询数据库的代码

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)

最佳答案

这个错误几乎总是由于游标完成后没有关闭。你从服务中调用 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;
}

关于Android - 从服务查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28063164/

相关文章:

java - InputStream 没有收到 EOF

加载图像时出现java.lang.OutOfMemoryError

Android:LinearLayout 占据 100% 的 View

java - 如何使复选框/ slider 持久化?

c++ - 无法在 C++ (android) 中创建 SQLite 表

mysql - 如何从sqlite数据库中的where子句获取多个元组

android - java.lang.NoClassDefFoundError : java. util.Objects

android - 将 View 转换为扩展 View 的 View

java - 如何更新和增量数据库?

android - 删除查询是否修改了 Android 选择查询游标?