getContentResolver()。查询问题

时间:2012-03-02 22:28:54

标签: android cursor android-contentprovider android-contentresolver

当它超过1mb堆内存时,这两个都在泄漏我的活动。我需要删除超过1mb的conacts i,e;超过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

1 个答案:

答案 0 :(得分:0)

使用Loader在单独的线程上运行查询。这在“加载程序”下的“开发人员指南”中有记录。顺便说一下,不推荐使用managedQuery()。

您应该从不直接在Activity上运行查询。你会很快挂掉所有东西。

您也会询问有关删除联系人的信息,但我没有看到任何执行此操作的代码。

为此,您应该使用ContentProviderOperation对象删除它们 ContentResolver.applyBatch()。除非你想匆忙地做,否则标记每一个 具有“允许产量”的ContentProviderOperation对象。

ArrayList oparray = new ArrayList;

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

oparray.add(OBJ);

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

这将会很慢,具体取决于联系人数据的数量。