Могу ли я использовать Query в Query? - PullRequest
0 голосов
/ 13 июля 2011

Допустим, у меня есть 2 таблицы, Contacts и Phones.Пользователь может ввести имя для запроса Contacts.Я использую это

Cursor cur = cr.query(
    CONTACT_URI, 
    new String[] { CONTACT_COLUMN_ID, CONTACT_COLUMN_NAME }, 
    CONTACT_COLLUMN_NAME + " LIKE '%" + search + "%'", 
    null, 
    null
);

И затем я хочу запросить у Phones совпадающего контакта, который я получил из первого запроса.Я могу использовать третий параметр для ввода моего состояния, например, «ГДЕ _ID = xx ИЛИ _ID = xx» и т. Д. *

Вопрос в том,

Могу ли я использовать первый запрос / курсоркак условие для следующего запроса?Мой второй запрос выглядит так:

Cursor pCur = cr.query(
    PHONE_URI, 
    new String[] { PHONE_COLUMN_ID, PHONE_COLUMN_DATA }, 
    null, 
    null, 
    null
);

РЕДАКТИРОВАТЬ: дополнительная заметка, я запрашиваю из базы данных устройства, поэтому у меня есть только Uri для использования.

РЕДАКТИРОВАТЬ 2: альтернативно, я могу использовать это

Cursor pCur = cr.query(
    PHONE_URI, 
    new String[] { PHONE_COLUMN_ID, PHONE_COLUMN_DATA }, 
    PHONE_COLUMN_ID, 
    selectedIds, 
    null
);

, но если selectedIds стал слишком большим, я получил это исключение

07-13 11:06:48.496: ERROR/AndroidRuntime(25137): FATAL EXCEPTION: main
07-13 11:06:48.496: ERROR/AndroidRuntime(25137): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.laac.comp.phonelookup/com.laac.comp.phonelookup.PhoneContactLookup}: android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x199d7c0
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.os.Looper.loop(Looper.java:143)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread.main(ActivityThread.java:4196)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at java.lang.reflect.Method.invokeNative(Native Method)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at java.lang.reflect.Method.invoke(Method.java:507)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at dalvik.system.NativeStart.main(Native Method)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137): Caused by: android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x199d7c0
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:408)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.content.ContentResolver.query(ContentResolver.java:264)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at com.laac.comp.phonelookup.PhoneContactLookup.getContactWithPhone(PhoneContactLookup.java:255)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at com.laac.comp.phonelookup.PhoneContactLookup.onCreate(PhoneContactLookup.java:84)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
07-13 11:06:48.496: ERROR/AndroidRuntime(25137):     ... 11 more

PhoneContactLookup.java:255 - мой запросEDIT 2

1 Ответ

0 голосов
/ 13 июля 2011

первая мысль является частью комментария:

cr.rawQuery("SELECT * FROM " + CONTACT_URI + "as cu LEFT JOIN " + PHONE_URI + " as pu ON  (cu.PHONE_COLUMN_ID = pu.PHONE_COLUMN_ID) WHERE CONTACT_COLUMN_NAME LIKE '%"+search+"%'");

Вторая мысль основана на ваших изменениях 2 Я думаю, вам нужно сначала создать строку запроса формата, которая имеет? в нужных местах, которые будут заполнены выбранным списком идентификаторов, поэтому я думаю, что это будет что-то вроде:

if(selectedIds.length==0)
    return;

String formatString = "PHONE_COLUMN_ID=?";
for(int i=0;i<selectedIds.length-1;i++)
{
    formatString+=" OR PHONE_COLUMN_ID=? ";
}
Cursor pCur = cr.query(
    PHONE_URI, 
    new String[] { PHONE_COLUMN_ID, PHONE_COLUMN_DATA }, 
    formatString, 
    selectedIds, 
    null
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...