如何在for循环或while循环中引用游标项?

问题描述:

我正在尝试循环创建制表符的数据库值。我设置了一个名为createTab的方法,它接受一个Long值和一个String值。它正在处理静态数据,但我很努力去理解如何遍历SQLite数据库记录。如何在for循环或while循环中引用游标项?

这里是我的失败尝试(小于符号替换[每种不超过]):


for (int i = 0; i [lessthan] mCursor.getCount(); i++) 
{ 
createTab(
    mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")), 
    mCursor.getString(mCursor.getColumnIndexOrThrow("category"))); 
} 

你可能不需要的logcat知道我做错了什么在上面的代码,但以防万一...

 
08-27 21:28:18.268: ERROR/AndroidRuntime(232): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:172) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:99) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at com.toBuy.Main.createTabs(Main.java:51) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at com.toBuy.Main.onCreate(Main.java:38) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
08-27 21:28:18.268: ERROR/AndroidRuntime(232):  ... 11 more 
08-27 21:28:18.278: INFO/Process(54): Sending signal. PID: 232 SIG: 3 
08-27 21:28:18.278: INFO/dalvikvm(232): threadid=7: reacting to signal 3 
08-27 21:28:18.338: INFO/dalvikvm(232): Wrote stack trace to '/data/anr/traces.txt' 
08-27 21:28:18.508: INFO/ARMAssembler(54): generated scanline__00000077:03515104_00000000_00000000 [ 27 ipp] (41 ins) at [0x285a68:0x285b0c] in 713498 ns 
08-27 21:28:18.518: INFO/ARMAssembler(54): generated scanline__00000077:03515104_00001001_00000000 [ 64 ipp] (84 ins) at [0x285b10:0x285c60] in 1897448 ns 
08-27 21:28:28.086: WARN/ActivityManager(54): Launch timeout has expired, giving up wake lock! 
08-27 21:28:28.097: WARN/ActivityManager(54): Activity idle timeout for HistoryRecord{4390bf70 com.toBuy/.Main} 

谢谢你的帮助。

您需要定位光标,然后才能呼叫getLonggetString。在发出查询之后,Cursor就位于第一行之前,因此您应该在循环中调用moveToNext。喜欢的东西:

int size = mCursor.getCount(); 
for (int i = 0; i < size; i++) { 

    // Position the cursor 
    mCursor.moveToNext(); 

    // Fetch your data values 
    long id = mCursor.getLong(mCursor.getColumnIndex("_id")); 
    String cat = mCursor.getString(mCursor.getColumnIndex("category")); 
} 
+0

谢谢你的回应。我在这里挣扎的是引用游标中的列。 //如何获取数据值查找长列(_id)和字符串列(类别)? – alockrem 2010-08-27 22:18:57

+0

您仍然可以像访问样本一样访问列值。 Cursor对象包含一个指向数据库中当前指向的行的指针,而您的示例代码只需在调用任何get *方法之前对其进行定位即可。如果这样不能解决您的问题,我会将数据库从设备(或模拟器)中取出,并仔细检查模式。 – 2010-08-28 01:01:26

使用for循环如下:

for(mCursor.moveToFirst();!mCursor.isAfterLast();mCursor.moveToNext()){ 
     createTab(
    mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")), 
    mCursor.getString(mCursor.getColumnIndexOrThrow("category")));  
     } 

虽然,while循环就会简单得多:

while (mCursor.moveToNext()) { createTab(
    mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")), 
    mCursor.getString(mCursor.getColumnIndexOrThrow("category")));  

}

在这两种情况下,你不需要手动设置光标的起始位置。

在我的代码中,我从SQLite数据库中获取值,并使用Cursor将该值存储在模型类(FriendData是我的模型类)的对象数组中。

Cursor cursor = friendAdapter.fetchData(); //call method for fetch data from databse and fetched data is stored into cursor 
    int cursorSize = cursor.getCount(); 

    if (cursor != null && cursor.moveToFirst()) { 
     FriendData[] friendData=new FriendData[cursorSize]; //create array of objects as size of cursor 

      for (int i = 0; i < cursorSize; i++) { 
        friendData[i]=new FriendData(); 

        /*store fetched data in some variables. In my code I have store value of cursor in friendName String variable*/ 
        friendName = cursor.getString(cursor.getColumnIndex(FriendAdapter.FRIEND_NM)); 

       /* set friendName variable value in array of object*/ 
       friendData[i].setFriendName(friendName); 

       cursor.moveToNext(); //move cursor for pointing to next fetched record 
      } 
    } 

首先我有检查光标条件是否为空,并移动光标对象指向第一个记录被提取。然后我使用方法getCount()计算游标的大小。之后for循环用于存储对象数组中的所有数据,并在结束时光标指向下一个被提取的记录。