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

Android 如何在for循环或while循环中引用光标项?,android,cursor,android-cursor,Android,Cursor,Android Cursor,我正在尝试通过创建选项卡来循环数据库值。我已经设置了一个名为createTab的方法,它接受一个长值和一个字符串值。它使用的是静态数据,但我很难理解如何循环使用SQLite数据库记录 以下是我失败的尝试(将[lessthan]替换为小于symbol): 您可能不需要LogCat来知道我在上面的代码中做错了什么,但以防万一 08-27 21:28:18.268: ERROR/AndroidRuntime(232): Caused by: android.database.CursorIndexOu

我正在尝试通过创建选项卡来循环数据库值。我已经设置了一个名为createTab的方法,它接受一个长值和一个字符串值。它使用的是静态数据,但我很难理解如何循环使用SQLite数据库记录

以下是我失败的尝试(将[lessthan]替换为小于symbol):

您可能不需要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} 08-27 21:28:18.268:错误/AndroidRuntime(232):由以下原因引起:android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为3 08-27 21:28:18.268:ERROR/AndroidRuntime(232):在android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)上 08-27 21:28:18.268:ERROR/AndroidRuntime(232):在android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:172) 08-27 21:28:18.268:ERROR/AndroidRuntime(232):在android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:99) 08-27 21:28:18.268:ERROR/AndroidRuntime(232):位于com.toBuy.Main.createTabs(Main.java:51) 08-27 21:28:18.268:ERROR/AndroidRuntime(232):位于com.toBuy.Main.onCreate(Main.java:38) 08-27 21:28:18.268:ERROR/AndroidRuntime(232):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)上 08-27 21:28:18.268:ERROR/AndroidRuntime(232):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 08-27 21:28:18.268:错误/AndroidRuntime(232):。。。还有11个 08-27 21:28:18.278:信息/处理(54):发送信号。PID:232信号:3 08-27 21:28:18.278:INFO/dalvikvm(232):threadid=7:对信号3作出反应 08-27 21:28:18.338:INFO/dalvikvm(232):将堆栈跟踪写入“/data/anr/traces.txt” 08-27 21:28:18.508:INFO/ARMAssembler(54):在713498纳秒[0x285a68:0x285b0c]处生成扫描线uuuuuu00000077:03515104 u00000000 00000000[27 ipp](41英寸) 08-27 21:28:18.518:INFO/ARMAssembler(54):在1897448纳秒[0x285b10:0x285c60]处生成扫描线 08-27 21:28:28.086:警告/活动管理器(54):启动超时已过期,放弃唤醒锁定! 08-27 21:28:28.097:WARN/ActivityManager(54):历史记录{4390bf70 com.toBuy/.Main}的活动空闲超时
谢谢您的帮助。

您需要先定位光标,然后才能调用
getLong
getString
。发出查询后,
光标
正好位于第一行之前,因此您应该在循环中调用
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"));
}
int size=mCursor.getCount();
对于(int i=0;i
使用以下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数据库中获取了值,并使用光标将该值存储在模型类的对象数组中(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
           }
     }
Cursor Cursor=friendAdapter.fetchData()//从数据库中提取数据的调用方法,提取的数据存储到游标中
int cursorSize=cursor.getCount();
if(cursor!=null&&cursor.moveToFirst()){
FriendData[]FriendData=新建FriendData[cursorSize];//创建对象数组作为光标大小
对于(int i=0;i

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

谢谢你的回复。此时我正在努力解决的是引用光标中的列。//Fetch your data value如何查找长列(_id)和字符串列(category)?您仍然可以像在示例中一样访问列值。游标对象包含一个指向它当前指向的数据库中的行的指针,您的示例代码只需要在调用任何get*方法之前定位它。如果这不能解决您的问题,我会将数据库从设备(或模拟器)上拔下,并仔细检查模式。
   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
           }
     }