android - 从 db 中选择,但 CursorIndexOutOfBoundsException 请求索引 2,大小为 2

标签 android sqlite android-sqlite android-cursor

我有一个函数,用于查找名称中包含子字符串的行。但是我收到错误,尽管使用 log.v 我可以看到结果返回正常。谁能告诉我这里出了什么问题吗?

这是我的 findAlbum 函数:

public ArrayList<Albums> findAlbum(String keyword) {
        ArrayList<Albums> albums = new ArrayList<Albums>();

        Cursor c = database.rawQuery("SELECT * FROM favorites " + "WHERE "
                + ALB_NAME + " LIKE '%" + keyword + "%';", null);
        c.moveToFirst();

        if (c != null) {
            while (!c.isAfterLast()) {
                for (int i = 0; i < c.getColumnCount(); i++) {
                    String id = c.getString(c.getColumnIndex("id"));
                    String name = c.getString(c.getColumnIndex(ALB_NAME));
                    String singer = c.getString(c.getColumnIndex(ALB_SINGER));
                    String genre = c.getString(c.getColumnIndex(ALB_GENRE));
                    String mix = c.getString(c.getColumnIndex(ALB_MIX));
                    String thumb = c.getString(c.getColumnIndex(ALB_THUMB));
                    albums.add(new Albums(id, name, singer, genre, mix, thumb));
                    Log.v("--", "FOUND FROM DB:" + albums.get(i).getTAG_NAME());
                    c.moveToNext();
                }

            }
        }
        return albums;
    }

和 LogCat 输出:

04-04 08:30:45.138: E/AndroidRuntime(7773): android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.myapp.functions.DatabaseHelper.findAlbum(DatabaseHelper.java:75)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.myapp.activities.Favorites$1.afterTextChanged(Favorites.java:67)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7655)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:8057)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.sendTextHasChanged(SpannableStringBuilder.java:900)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:353)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:266)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:443)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:420)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:29)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:663)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:188)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:149)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.os.Looper.loop(Looper.java:137)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at android.app.ActivityThread.main(ActivityThread.java:4440)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at java.lang.reflect.Method.invokeNative(Native Method)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at java.lang.reflect.Method.invoke(Method.java:511)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-04 08:30:45.138: E/AndroidRuntime(7773):     at dalvik.system.NativeStart.main(Native Method)

最佳答案

您的问题是,您试图获取索引 2 处的项目,但 Cursor 的大小为 2 并且索引从 0 开始,因此您试图获取索引处不存在的项目。

我认为你真的不需要内部 for 循环,而这个循环就是你的问题。就在那里你打电话

c.moveToNext();

与列计数一样多的次数。例如,如果您有五列并且 Cursor 有两行,则您的 moveToNext() 方法调用 5 次将导致 CursorIndexOutOfBoundsException。因此,删除内部循环,它应该可以工作。

我建议您将代码更改为以下内容:

if (c != null)
   if (c.moveToFirst()) {
      do {         
         String id = c.getString(c.getColumnIndex("id"));
         String name = c.getString(c.getColumnIndex(ALB_NAME));
         String singer = c.getString(c.getColumnIndex(ALB_SINGER));
         String genre = c.getString(c.getColumnIndex(ALB_GENRE));
         String mix = c.getString(c.getColumnIndex(ALB_MIX));
         String thumb = c.getString(c.getColumnIndex(ALB_THUMB));
         albums.add(new Albums(id, name, singer, genre, mix, thumb));
         Log.v("--", "FOUND FROM DB:" + albums.get(i).getTAG_NAME());
      } while (c.moveToNext());
   }
}

关于android - 从 db 中选择,但 CursorIndexOutOfBoundsException 请求索引 2,大小为 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804111/

相关文章:

sqlite - 通过分配的列名排序SQLite结果

android - 如何保护android数据库文件?

android - 如何在 BuildSrc 中创建 FlavorConfig?

java - 如何使用 SQLiteOpenHelper Android 在单个应用程序中创建多个数据库

android - 如何为 NavigationView 中的单个菜单项提供自定义文本颜色?

sqlite - 在 codeigniter 中使用 SQLite

android - 如何在 android retrofit 1.9 中从 List 发送多个 @Field?

android - 真的有必要在每次应用程序启动时都创建 SQLite 表吗?

android - Skobbler 获得环岛导出

java - 如何在建立 URL 连接之前检测用户是否有 3G/Wifi?