2012-03-29 28 views
14

मेरे पास फ़ोन नंबरों की एक श्रृंखला है और मैं संपर्क डेटाबेस से संबंधित संपर्क नाम प्राप्त करना चाहता हूं।मैन्युअल रूप से कर्सर में पंक्तियां जोड़ना

फ़ोन नंबरों की सरणी में, मेरे पास कुछ संख्याएं हैं जो संपर्क डेटाबेस से पहले सहेजी नहीं जाती हैं। उदाहरण के लिए;

  • 3333333 -> टिम
  • 5555555 -> जिम
  • 1111111 -> अज्ञात

मैं सरणी फ़ोन नंबर वाला, ऊपर से पता चला है अर्थात् phoneArr

int size=phoneArr.size(); 
if(size>0){ 
     Cursor[] cursors=new Cursor[size]; 
     for(int i=0;i<size;i++){ 
      Uri contactUri1 = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneArr.get(i))); 
      cursors[i] = getContentResolver().query(contactUri1, PEOPLE_PROJECTION, null, null, " _id asc limit 1"); 
     } 
     Cursor phones=new MergeCursor(cursors); 

फ़ोन.getCount() उपर्युक्त परिदृश्य में 2 लौटाता है। जब संपर्क सूची में फ़ोन नंबर प्रकट नहीं होता है तो कर्सर खाली हो जाता है और किसी भी तरह जब मैं उन्हें विलय करता हूं तो यह कुछ भी योगदान नहीं देता है। क्या मैं चाहता हूँ के रूप में

कर्सर फोन का पालन करने वाले कर्सर है -> {टिम, जिम, 1111111}

मुझे लगता है कि इस प्रकार मैं मैन्युअल रूप से पंक्ति जोड़ कर ऐसा कर सकते हैं:

Uri contactUri1 = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneArr.get(i))); 
cursors[i] = getContentResolver().query(contactUri1, PEOPLE_PROJECTION, null, null, " _id asc limit 1"); 
if(cursors[i].getCount()==0) 
    // add the phone number manually to the cursor 

मैं इसे कैसे प्राप्त कर सकता हूं?

यहाँ PEOPLE_PROJECTION

private static final String[] PEOPLE_PROJECTION = new String[] { 
    ContactsContract.PhoneLookup._ID, 
    ContactsContract.PhoneLookup.DISPLAY_NAME, 
    ContactsContract.PhoneLookup.NUMBER 
}; 
+0

कृपया मेरे समाधान पर एक नज़र डालें, और अगर यह समस्या हल करता है तो इसके लिए वोट दें =) – elgui

+0

कृपया आपके द्वारा स्वीकार किए गए उत्तर की समीक्षा करें, यह एंड्रॉइड एसडीके की वर्तमान उपलब्ध सुविधाओं के मुताबिक गलत लगता है। –

+0

ठीक है, जब तक मैंने जवाब स्वीकार किया, यह उचित लग रहा था। जब मैं कुछ खाली समय लेता हूं तो मैं इसकी समीक्षा करूंगा। – 0x5f3759df

उत्तर

43

कर्सर में पंक्तियों को जोड़ने का सबसे आसान तरीका MatrixCursor और MergeCursor का उपयोग करना है। उन दो वर्गों एसडीके से हैं और यहां ऐसी समस्याओं को हल करने के लिए हैं।

मूल रूप से है कि आप क्या है:

  1. पंक्तियों आप एक MatrixCusror
  2. में जोड़ने के लिए मर्ज में रखें अपने cursor और अपने matrixCursor का उपयोग कर एक MergeCursor

कुछ की तरह:

// Create a MatrixCursor filled with the rows you want to add. 
MatrixCursor matrixCursor = new MatrixCursor(new String[] { colName1, colName2 }); 
matrixCursor.addRow(new Object[] { value1, value2 }); 

// Merge your existing cursor with the matrixCursor you created. 
MergeCursor mergeCursor = new MergeCursor(new Cursor[] { matrixCursor, cursor }); 

// Use your the mergeCursor as you would use your cursor. 
+0

क्या आप इसे bindView विधि के शीर्ष पर रखेंगे? –

+0

मुझे लगता है कि कर्सर को एडाप्टर में पास करने से पहले ऐसा करना बेहतर है। क्वेरी करने के ठीक बाद। –

+4

'mergeCursor' में इस नई पंक्ति का' अनुक्रमणिका 'क्या होगा? – Nezam

1

दुर्भाग्य से, जहाँ तक मुझे पता है, वहाँ कोई रास्ता नहीं है कि आप मैन्युअल कर्सर को डेटा जोड़ सकते हैं है। आपको इसे एक अलग तरीके से संभालना होगा।

एक ही रास्ता है कि मैं जिसमें आप यह कर सकते हैं के बारे में सोच सकते हैं

  • डेटा फ़ील्ड आप की जरूरत के साथ एक संरचना बनाने है।
  • एक ऐरेलिस्ट बनाएं और कर्सर से डेटा के साथ अपनी संरचना की वस्तुओं को भरें और उन्हें सूची में जोड़ें।
  • अब अपनी अनुपलब्ध संख्या की जानकारी मैन्युअल रूप से जोड़ें और उन्हें सूची में जोड़ें।
  • इस सूची को अपने एडाप्टर पर पास करें, अगर आप अब कर्सर को एडाप्टर में पास कर रहे हैं। बेशक आपको arrayadapter पर अपना cursoradapter कार्यान्वयन बदलना होगा।
+0

वैसे यह मैं नहीं सुनना चाहता हूं :) वैसे भी – 0x5f3759df

+0

उत्तर देने के लिए धन्यवाद, मुझे पता है। यह एक बड़ा दर्द है। मैंने कई बार शाप दिया है कि मुझे इस कई बार सामना करना पड़ा। हालांकि यदि आप कर्सर (जो मुझे वास्तव में संदेह है) में जोड़ने का कोई तरीका ढूंढने का प्रबंधन करते हैं, तो इस पोस्ट पर साझा करें। और फॉलबैक के रूप में आप इस विधि का उपयोग कर सकते हैं। – Shubhayu

+1

कृपया मेरे समाधान पर एक नज़र डालें, यह समस्या हल कर सकता है =) – elgui

2

मुझे यह एक पुरानी पोस्ट पता है, लेकिन यह एक वास्तविक दर्द है कि पंक्तियों को मैन्युअल रूप से कर्सर में जोड़ा नहीं जा सकता है। मैं एक कच्चे समाधान के साथ आया हूँ। यह कुछ मदद की हो सकती है।

Cursor वास्तव में एक interface है और आप एक कस्टम class कि Cursor इंटरफ़ेस implements बना सकते हैं।

class ManualCursor implements Cursor{ 
     // .... 
     private Vector<String[]> rows; 

     public void addRow(String[] values){ 
      rows.add(values); 
     } 

     // Implement the necessary methods, getString(int), etc. 

     //.... 
} 

और अंत में अपने कोड

if (cursors[i].getCount() == 0){ 
    cursors[i] = new ManualCursor(); 
    cursors[i].addRow(rowValues); 
} 

कि यह करना चाहिए में।लेकिन चेतावनी दी जानी चाहिए, इसके लिए काम करने के लिए, Cursor इंटरफेस को लागू करते समय आपको बुद्धिमान होना होगा।

3

मैं ऐसे समाधान का उपयोग करता हूं जो मेरी सभी अलग-अलग ज़रूरतों के लिए चाल करता है, और जो कर्सर को लागू करने से सरल है।
यहां एक उदाहरण दिया गया है जहां मुझे एक कर्सर को अतिरिक्त "प्लेलिस्ट" पंक्तियां जोड़नी होंगी, जिसे मेडियास्टोर से पुनर्प्राप्त किया गया है। मैं मूल कर्सर के पहले अनुक्रमित पर पंक्तियों को जोड़ने:

public class CursorWithExtraPlaylists extends CursorWrapper { 

public static final int ID_COLUMN_INDEX = 0; 
public static final int NAME_COLUMN_INDEX = 1; 

private int mPos = -1; 
private Context mContext; 
private Playlist[] extras; 

public CursorWithExtraPlaylists(Cursor cursor, Context context, 
     Playlist[] extras) { 
    super(cursor); 
    mContext = context; 
    this.extras = extras; 
} 

@Override 
public int getCount() { 
    return super.getCount() + extras.length; 
} 

@Override 
public int getPosition() { 
    return mPos; 
} 

@Override 
public boolean moveToFirst() { 
    return moveToPosition(0); 
} 

@Override 
public boolean moveToLast() { 
    return moveToPosition(getCount() - extras.length); 
} 

@Override 
public boolean move(int offset) { 
    return moveToPosition(mPos + offset); 
} 

@Override 
public boolean moveToPosition(int position) { 
    // Make sure position isn't past the end of the cursor 
    final int count = getCount(); 
    if (position >= count) { 
     mPos = count; 
     return false; 
    } 
    // Make sure position isn't before the beginning of the cursor 
    if (position < 0) { 
     mPos = -1; 
     return false; 
    } 
    // Check for no-op moves, and skip the rest of the work for them 
    if (position == mPos) { 
     return true; 
    } 

    mPos = position; 
    if (mPos > 0) { 
     // ok, that concerns super cursor 
     return super.moveToPosition(mPos - 1); 
    } 
    return true; 
} 

@Override 
public boolean moveToNext() { 
    return moveToPosition(mPos + 1); 
} 

@Override 
public boolean moveToPrevious() { 
    return moveToPosition(mPos - 1); 
} 

private boolean isPointingOnExtras() { 
    if (-1 == mPos || getCount() == mPos) { 
     throw new CursorIndexOutOfBoundsException(mPos, getCount()); 
    } 
    if (mPos <= extras.length - 1) { 
     // this is a request on an extra value 
     return true; 
    } 
    return false; 
} 

private Object getExtraValue(int columnIndex) { 
    switch (columnIndex) { 
    case ID_COLUMN_INDEX: 
     return extras[mPos].getId(); 
    case NAME_COLUMN_INDEX: 
     return extras[mPos].getName(mContext); 
    } 
    return null; 
} 

@Override 
public int getInt(int columnIndex) { 
    if (isPointingOnExtras()) 
     return (Integer) getExtraValue(columnIndex); 
    int res = super.getInt(columnIndex); 
    return res; 
} 

@Override 
public String getString(int columnIndex) { 

    if (isPointingOnExtras()) 
     return getExtraValue(columnIndex).toString(); 
    return super.getString(columnIndex); 
} 

public static class Playlist { 
    private int mId; 
    private int mNameResId; 

    public Playlist(int mId, int nameResId) { 
     this.mId = mId; 
     this.mNameResId = nameResId; 
    } 

    public int getId() { 
     return mId; 
    } 

    public String getName(Context mContext) { 
     return mContext.getResources().getString(mNameResId); 
    } 

} 
} 

मूल कर्सर 2 कॉलम (पूर्णांक, स्ट्रिंग) है, तो मैं अतिरिक्त पंक्तियों में ऑब्जेक्ट की श्रृंखला के साथ निर्माण।

+1

यह बहुत बढ़िया है .. बहुत बहुत धन्यवाद – amithgc

संबंधित मुद्दे