Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中使用SQLite获取RowID_Java_Android_Sqlite - Fatal编程技术网

Java 在Android中使用SQLite获取RowID

Java 在Android中使用SQLite获取RowID,java,android,sqlite,Java,Android,Sqlite,我正在创建一个应用程序来记录不同课程的作业。每个类都有自己的唯一ID,因此为每个类列出的作业不会与其他类重叠。下面是我为某个类找到rowid的方法 public int getIdFromClassName(String className){ String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'";

我正在创建一个应用程序来记录不同课程的作业。每个类都有自己的唯一ID,因此为每个类列出的作业不会与其他类重叠。下面是我为某个类找到rowid的方法

public int getIdFromClassName(String className){
    String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'";
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery(query, null);
    return res.getColumnIndex("id");
}
但是,这始终返回值-1

关于如何更改以返回正确的rowid值,您有什么想法吗

编辑:

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table " + CLASSES_TABLE_NAME + " " +
                    "(id integer primary key, " + CLASSES_COLUMN_NAME + " text)"
    );
    db.execSQL(
            "create table " + ASSIGNMENTS_TABLE_NAME + " " +
                    "(id integer primary key, " + ASSIGNMENTS_COLUMN_NAME + " text, " + ASSIGNMENTS_COLUMN_TOTAL_POINTS
                    + " INTEGER, " + ASSIGNMENTS_COLUMN_CLASS_ID + " INTEGER)");

}
res.getColumnIndex(“id”)将为您获取名为“id”的列的列索引。既然你得到了-1,它就找不到了。。您确定您的id列不是“\u id”吗

要想让它发挥作用,你应该这样做

res.getLong(res.getColumnIndex("_id"));

(我建议您使用getLong()而不是getInt(),因为SQLite数据库ID可能会比int大)

如果光标为空,请检查您的日志,确认您的表已成功创建;如果光标不为空,请确保您的表中有列
id

您可以尝试以下操作:

public int getIdFromClassName(String className){
String query = "SELECT id FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery(query, null);
int id=-1;
If(res!=null&&res.moveToFirst())
id=res.getInt(res.getColumnIndex("id"));
return id;
}

查询返回的列名为
rowid
,因此找不到名为
id
的列

确保在查询和调用
getColumnIndex
时使用相同的列名

该列的索引始终为零;您还需要从列中读取实际值:

int-colIndex=res.getColumnIndexOrThrow(“rowid”);//=0
if(res.moveToFirst()){
返回res.getInt(colIndex);
}否则{
//找不到
}
然而,Android有一个更易于读取单个值的

public int getIdFromClassName(字符串className){
String query=“选择行ID”+
“FROM”+类\表\名称+
其中“+CLASSES_COLUMN_NAME+”=?;”;
SQLiteDatabase db=this.getReadableDatabase();
返回DatabaseUtils.longForQuery(db,query,新字符串[]{className});
}

尝试下面的查询以创建新列名
rowID

Cursor cursor= db.rawQuery("SELECT *,"+CLASSES_TABLE_NAME +".rowid AS rowID"+" FROM "+CLASSES_TABLE_NAME , null);
在此查询之后,您可以从
rowid
列中获取真实的
rowid

while (cursor.moveToNext()) {
        long chatRow=cursor.getLong(
                cursor.getColumnIndexOrThrow("rowID"));
}

你试过这个吗?返回res.getString(res.getColumnIndex(“id”));这将返回一个字符串,但我正在寻找intit依赖形式的id…您用于id的数据类型…我认为您也可以使用getInt..如果其数据类型为integerif仍然未解析..您可以检查res.moveToFirst()方法如果您不知道您的
游标
包含调用
DatabaseUtils.dumpCursor
的哪些列,该调用将返回exeption:android.database.CursorIndexOutOfBoundsException:Index-1,大小为1@Kinoscorpia您的ID列的名称是什么?如果找不到“id”或“\u id”,它将返回-1。编辑:根据SQL判断,列的名称“rowid”正确吗?所以试试res.getLong(res.getColumnIndex(“rowid”);添加了检查SQL语句所需的onCreate方法。。它应该是“从“+CLASSES\u TABLE\u NAME+”中选择id,其中“+CLASSES\u COLUMN\u NAME+”='“+className+”;
while (cursor.moveToNext()) {
        long chatRow=cursor.getLong(
                cursor.getColumnIndexOrThrow("rowID"));
}