1

我正在 Android 中创建一个数据库,一切都很顺利,但是当我测试检索正确数据的查询时,我遇到了一个错误。

E/AndroidRuntime(14126): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

我知道这意味着没有与查询匹配的数据,但事实是我通过查询插入了数据并且它实际上有一个匹配项。同样的查询适用于所有没有重音符号的代码。

这些是用于插入行的查询。

INSERT INTO "codigo" VALUES('A','PEATÓN');
INSERT INTO "codigo" VALUES('B','PEATÓN');
INSERT INTO "codigo" VALUES('C','PEATÓN');

所以我做了一个查询来获取我要替换的字段的值,如下所示:

String selectCode = "select distinct c.tipo from codigo c";
Cursor cursor = database.rawQuery(selectCodigo, new String[] {});
      cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
          String codigo= cursor.getString(0);
          codigos.add(codigo);        
          System.out.println(codigo);
          cursor.moveToNext();
        } 
        cursor.close();
      return codigos;

结果是这样的:

10-14 16:40:32.140: I/System.out(13716): PEAT�N

我在 /raw 文件夹中有文本文件,并且我从 Eclipse 中进行了编辑,所以我确保它不是我所做的表导出,但我得到了相同的结果。

这是读取文件的代码:

 public int insertFromFile(SQLiteDatabase db,Context context, int resourceId) throws IOException {
            // Reseting Counter
            int result = 0;
            // Open the resource
            InputStream insertsStream = context.getResources().openRawResource(resourceId);
            BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertsStream));

            // Iterate through lines (assuming each insert has its own line and theres no other stuff)
            while (insertReader.ready()) {
                String insertStmt = insertReader.readLine();
                db.execSQL(insertStmt);
                result++;
            }
            insertReader.close();

            // returning number of inserted rows
            return result;
        } 

我怎样才能让这种口音起作用?我用了很多,所以,替换这个词不是出路。请帮忙,这是我完成这个项目唯一需要做的事情。

更新:两次后又遇到了同样的问题。第一个我通过使用 cp1525 编码的 .sql 文件来修复它,并使用默认编辑器在 Eclipse 中打开它并查找/替换错误的字符。

上次我遇到此错误时,我以正确的方式进行操作,发现如果您使用 SQLiteManager,它会导入以 UTF-8 编码的文件,但会以 ANSI 导出文件,因此我使用 Notepad++ 打开文件,更改将 .sql 文件从 ANSI 转换为 UTF-8,它工作正常,所有字符都显示得很好。

4

2 回答 2

1

InputStreamReader 构造函数文档说:

在 上构造一个新InputStreamReaderInputStream in。此构造函数将字符转换器设置为“file.encoding”属性中指定的编码,如果该属性不存在,则回退到 ISO 8859_1 (ISO-Latin-1)。

如果文件以 UTF-8 编码,您必须告诉读者这一点。

于 2013-10-17T13:38:38.577 回答
0

在你的 SQLQueryString 之前添加

PRAGMA encoding = "UTF-8";

例子

"PRAGMA encoding = \"UTF-8\"; INSERT INTO MYTABLE (mytablefield) VALUES ('value'); "
于 2014-06-27T01:40:50.230 回答