Java Android SQLite抛出无法从游标窗口读取第0行第1列

Java Android SQLite抛出无法从游标窗口读取第0行第1列,java,android,sqlite,Java,Android,Sqlite,今天,我想在我的消息传递应用程序中实现一个简单的SQLite数据库,该应用程序应该负责保存消息,不幸的是,我无法从数据库中读回数据并将其显示到ListView中 我在模拟器上通过ADB查看了数据库,发现数据保存正确 这是我的密码 使用空列初始化表 db.execSQL("CREATE TABLE IF NOT EXISTS Messages(zero);"); 创建以聊天联系人作为列名的列 public void addMessagetoDB(String message, String fr

今天,我想在我的消息传递应用程序中实现一个简单的SQLite数据库,该应用程序应该负责保存消息,不幸的是,我无法从数据库中读回数据并将其显示到ListView中

我在模拟器上通过ADB查看了数据库,发现数据保存正确

这是我的密码

使用空列初始化表

db.execSQL("CREATE TABLE IF NOT EXISTS Messages(zero);");
创建以聊天联系人作为列名的列

public void addMessagetoDB(String message, String from) {
    Toast.makeText(this.getApplicationContext(), "msg msg", Toast.LENGTH_LONG).show();
    try
    {
        db.execSQL("ALTER TABLE Messages ADD COLUMN '" + from + "' TEXT");
    }
    catch (android.database.sqlite.SQLiteException e)
    {

    }
    db.execSQL("INSERT INTO Messages ('" + from + "') VALUES('" + message + "');");
}
在这里,我还可以看到SQLite可以识别我的列名,因为当我向客户端发送多条消息时,会收到调试消息

E/SQLiteLog﹕ (1) duplicate column name: test@zapp.org
这是我的读数,不起作用

public void updateView(String from) {
        Cursor crs = zapp.rawQuery("SELECT * FROM Messages", null);
        while (crs.moveToNext()) {
            String name = crs.getString(crs.getColumnIndex(from));
            messages.add(name);
        }
        arrayAdapter.notifyDataSetChanged();
}
这是我的例外

06-05 22:15:45.841    4926-4926/? E/SQLiteCursor﹕ requesting column name with table name -- test@zapp.org
    java.lang.Exception
            at android.database.sqlite.SQLiteCursor.getColumnIndex(SQLiteCursor.java:180)
            at org.reisacher.zapp.ChatActivity.updateView(ChatActivity.java:43)
            at org.reisacher.zapp.MainActivity$1.onItemClick(MainActivity.java:52)
            at android.widget.AdapterView.performItemClick(AdapterView.java:305)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1146)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053)
            at android.widget.AbsListView$3.run(AbsListView.java:3860)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-05 22:15:45.841    4926-4926/? E/CursorWindow﹕ Failed to read row 0, column -1 from a CursorWindow which has 5 rows, 2 columns.
06-05 22:15:45.841    4926-4926/? D/AndroidRuntime﹕ Shutting down VM
06-05 22:15:45.841    4926-4926/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: org.reisacher.zapp, PID: 4926
    java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
            at android.database.CursorWindow.nativeGetString(Native Method)
            at android.database.CursorWindow.getString(CursorWindow.java:438)
            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
            at org.reisacher.zapp.ChatActivity.updateView(ChatActivity.java:43)
            at org.reisacher.zapp.MainActivity$1.onItemClick(MainActivity.java:52)
            at android.widget.AdapterView.performItemClick(AdapterView.java:305)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1146)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053)
            at android.widget.AbsListView$3.run(AbsListView.java:3860)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
正如人们所看到的,SQLite正在尝试获取列名,该列名与我将消息保存到的列名相匹配,但该列名会以某种方式读取列-1

我没有找到解决这种行为的方法


谢谢

问题在于字段名中有一个“.”,引擎将其理解为table.field分隔符

换句话说,getColumnIndex()试图在表中查找“org”的数字索引test@zapp' ... 不将该类型的值用于字段名的另一个原因

给出它的线索是“E/SQLiteCursor”﹕ 正在请求具有表名的列名--test@zapp.org"


我还想质疑您的想法,即根据“from”值动态地向表中添加列,使表水平增长,而不是让它垂直扩展的常规方法。当它变得更大、更笨拙时,它会变得越来越慢。

您是否以某种方式命名了其中一列:test@zapp.org"? 可能是您错误地尝试使用此电子邮件(/id)检索数据?我之所以这么问,是因为您似乎将此电子邮件作为参数调用方法updateView(stringfrom)。[代码]请求具有表名的列名--test@zapp.org[cod]谢谢,它工作了,在“@”字符处用子字符串替换了“from”值。你垂直扩展它是什么意思。我为一个联系人添加了一列,然后在下面相应的列中添加了来自或发往该联系人的消息,使表垂直增长