运行 Android 中的 SQLite 查询
Running SQLite query in Android
我是 android 中 SQLite 查询的新手。正在尝试 运行 查询。但是,应用程序不断崩溃并出现以下错误:
Caused by: java.lang.IllegalStateException: Couldn't read row 1, col
-1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
以下为代码摘录
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();
}
下面是我正在使用的 table 创建代码。 (欢迎提出建议,使它不那么笨拙)。
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)";
首先删除这一行:
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}
);
我是 android 中 SQLite 查询的新手。正在尝试 运行 查询。但是,应用程序不断崩溃并出现以下错误:
Caused by: java.lang.IllegalStateException: Couldn't read row 1, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
以下为代码摘录
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();
}
下面是我正在使用的 table 创建代码。 (欢迎提出建议,使它不那么笨拙)。
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)";
首先删除这一行:
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}
);