【问题标题】:Running SQLite query in Android在 Android 中运行 SQLite 查询
【发布时间】:2020-05-26 13:05:51
【问题描述】:

我是 android 中 SQLite 查询的新手。尝试运行查询。但是,应用程序不断崩溃并出现以下错误:

原因:java.lang.IllegalStateException:无法读取第 1 行,col -1 来自光标窗口。确保 Cursor 在从中访问数据之前已正确初始化。

以下是代码摘录

public String getOutputData(){
    String inputData = "'Vineet'";

    Cursor cursorNew = db.rawQuery("SELECT email FROM groupseries INNER JOIN email " +
            "ON groupseries.emailid = email._id INNER JOIN user ON " +
            "groupseries.userid = user._id WHERE name=" + inputData, null);
    cursorNew.moveToFirst ();
    StringBuffer buffer = new StringBuffer();

    while(cursorNew.moveToNext()){
        int index1 = cursorNew.getColumnIndex(DatabaseHelper.KEY_NAME);
        int index2 = cursorNew.getColumnIndex(DatabaseHelper.KEY_EMAIL);
        String userID = cursorNew.getString(index1);
        String emailID = cursorNew.getString(index2);
        buffer.append(userID + " " + emailID + "\n");
    }
    return buffer.toString();
}

下面是我正在使用的表创建代码。 (欢迎提出建议以减少笨拙)。

private static final String DATABASE_NAME = "tryDemoDataBase.db";
    private static final String TABLE_NAME_USER = "user";
    private static final String TABLE_NAME_EMAIL = "email";
    private static final String TABLE_NAME_GROUP = "groupseries";
    private static final int DATABASE_VERSION = 12;
    private static final String KEY_ROWID_USER = "_id";
    private static final String KEY_ROWID_EMAIL = "_id";
    private static final String KEY_ROWID_GROUP = "_id";
    private static final String REFERENCE_USER_ID = "userid";
    private static final String REFERENCE_EMAIL_ID = "emailid";
    private static final String KEY_NAME="name";
    private static final String KEY_EMAIL = "email";
    private static final String CREATE_TABLE_USER = "create table "+ TABLE_NAME_USER
            + " ("+ KEY_ROWID_USER+" integer primary key autoincrement, "
            + KEY_NAME + " text)";
    private static final String CREATE_TABLE_EMAIL = "create table "+ TABLE_NAME_EMAIL
            + " ("+ KEY_ROWID_EMAIL+" integer primary key autoincrement, "
            + KEY_EMAIL + " text)";
    private static final String CREATE_TABLE_GROUP = "create table " + TABLE_NAME_GROUP+ " ("
            + KEY_ROWID_GROUP+" integer primary key autoincrement, "
            + REFERENCE_USER_ID + " integer, " + REFERENCE_EMAIL_ID + " integer)";

【问题讨论】:

    标签: java android sqlite cursor android-sqlite


    【解决方案1】:

    首先删除这一行:

    cursorNew.moveToFirst();
    

    因为以后你会使用:

    while (cursorNew.moveToNext())
    

    所以实际上您正在跳过结果的第一行(也许是唯一的)。
    然后,如果您想从 Cursor 对象中检索它,则必须在所选列中包含 name 列:

    Cursor cursorNew = db.rawQuery("SELECT name, email FROM groupseries INNER JOIN email " +
                "ON groupseries.emailid = email._id INNER JOIN user ON " +
                "groupseries.userid = user._id WHERE name=" + inputData, null);
    

    并建议使用推荐且安全的方式将参数传递给查询,而不是直接连接它们。
    使用? 占位符:

    String inputData = "Vineet"; // no quotes
    Cursor cursorNew = db.rawQuery(
                "SELECT name, email FROM groupseries INNER JOIN email " +
                "ON groupseries.emailid = email._id INNER JOIN user ON " +
                "groupseries.userid = user._id WHERE name=?", 
                 new String[] {inputData}
    );
    

    【讨论】:

    • 谢谢。那太容易了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多