android游标无法正常获取错误

时间:2014-02-20 18:57:49

标签: android sqlite cursor

public class TestActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ContentResolver cr=getContentResolver();
    Cursor phone=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
    while(phone.moveToNext())
    {
        String name=phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        Log.d("name:", name);
        get(name);
    }phone.close();
}

private void get(String name) {
    DatabaseHandler db=new DatabaseHandler(getApplicationContext());
    Cursor c=db.returnFriend(name);
    Log.d("get", c.getString(0));

}


 }

   //Databse Handler Class query
public Cursor returnFriendList(String names)
{
    SQLiteDatabase db=this.getReadableDatabase();
    return db.query(TABLE_CONTACT, new String[]{name}, name+"=?", new String[] { String.valueOf(names) },null, null,null);


}

堆栈跟踪:

02-27 01:15:58.489: E/AndroidRuntime(32140): FATAL EXCEPTION: main
02-27 01:15:58.489: E/AndroidRuntime(32140): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidhive/com.example.androidhive.TestActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread.access$600(ActivityThread.java:122)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.os.Looper.loop(Looper.java:137)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread.main(ActivityThread.java:4340)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at java.lang.reflect.Method.invokeNative(Native Method)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at java.lang.reflect.Method.invoke(Method.java:511)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at dalvik.system.NativeStart.main(Native Method)
02-27 01:15:58.489: E/AndroidRuntime(32140): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:434)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at com.example.androidhive.TestActivity.get(TestActivity.java:33)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at com.example.androidhive.TestActivity.onCreate(TestActivity.java:26)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.Activity.performCreate(Activity.java:4465)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
02-27 01:15:58.489: E/AndroidRuntime(32140):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
02-27 01:15:58.489: E/AndroidRuntime(32140):    ... 11 more

2 个答案:

答案 0 :(得分:3)

Cursor c=db.returnFriend(name);
Log.d("get", c.getString(0));

在开始对光标执行操作之前,您没有moveToFirst,因此将其置于-1。

答案 1 :(得分:-1)

更改以下内容,

ContentResolver cr=getContentResolver();
Cursor phone=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if(phone!=null){
   **phone.moveToFirst();**
   do
   {
        String name = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        Log.d("name:", name);
        get(name);
    }while(phone.moveToNext());
    phone.close();
}

phone.moveToFirst(),您可以将光标指向可用的第一行数据,然后使用moveToNext()继续从那里读取;