【问题标题】:getContentResolver().query issuegetContentResolver().query 问题
【发布时间】:2012-03-02 22:28:53
【问题描述】:

当它超过 1mb 堆内存时,这两个都泄漏了我的活动。我需要删除超过 1mb 的联系人,即;超过 2500 个联系人。

Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

有什么替代方法或解决方法? 然后我做

if (cur.moveToFirst()) {
        do {
            String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
            cr.delete(uri, null, null);             
        } while (cur.moveToNext());    
    }
    cur.close(); 

如何一次只能删除 100-200 个联系人?还是其他方式?

日志:

03-02 14:26:57.317: E/CursorWindow(5357): need to grow: mSize = 1048576, size = 216, freeSpace() = 135, numRows = 2616
03-02 14:26:57.317: E/CursorWindow(5357): not growing since there are already 2616 row(s), max size 1048576
03-02 14:26:57.317: E/CursorWindow(5357): The row failed, so back out the new row accounting from allocRowSlot 2615
03-02 14:26:57.317: E/Cursor(5357): Failed allocating fieldDir at startPos 0 row 2615

【问题讨论】:

    标签: android cursor android-contentprovider android-contentresolver


    【解决方案1】:

    使用加载器在单独的线程上运行查询。这在 Loaders 下的 Developers Guide 中有记录。顺便说一句,managedQuery() 已被弃用。

    您应该永远直接在 Activity 上运行查询。你会很快把所有东西都挂起来。

    您还询问有关删除联系人的问题,尽管我没有看到任何执行此操作的代码。

    为此,您应该使用 ContentProviderOperation 对象和 ContentResolver.applyBatch()。除非你想匆忙做,否则标记每一个 ContentProviderOperation 对象与“yield allowed”。

    ArrayList oparray = new ArrayList;

    objBuilder = ContentProviderOperation.newDelete(ContactsContract.Contacts.CONTENT_URI); objBuilder.withYieldAllowed(true); obj = objBuilder.build();

    oparray.add(obj);

    getContentResolver().applyBatch(ContactsContract.AUTHORITY, oparray);

    这会很慢,具体取决于有多少联系人数据。

    【讨论】:

    • ArrayList oparray = new ArrayList(); //ArrayList oparray = new ArrayList; ContentProviderOperation.Builder objBuilder = ContentProviderOperation.newDelete(ContactsContract.Contacts.CONTENT_URI); objBuilder.withYieldAllowed(true); //objBuilder.withExpectedCount(12); ContentProviderOperation obj = objBuilder.build(); oparray.add(obj); oparray.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .build());
    • 加上 ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, oparray);`
    • 这不会删除任何联系人。
    • 你真的应该用标签来包装你的代码。让您更容易理解您的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多