Java android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0,但之前为完全相同的代码工作

Java android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0,但之前为完全相同的代码工作,java,android,sqlite,Java,Android,Sqlite,整个项目最初使用的是完全相同的代码,我甚至将其还原回一个时间段,在该时间段中,它没有显示android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0。我诚恳地寻求帮助来解决这个问题,因为我知道它相当简单,因为它是关于游标的,但我仍然无法掌握它的窍门 相关代码如下: DatabaseOperations.java 包m.rami.psu import android.content.ContentValues; import android

整个项目最初使用的是完全相同的代码,我甚至将其还原回一个时间段,在该时间段中,它没有显示android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0。我诚恳地寻求帮助来解决这个问题,因为我知道它相当简单,因为它是关于游标的,但我仍然无法掌握它的窍门

相关代码如下:

DatabaseOperations.java 包m.rami.psu

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DatabaseOperations extends SQLiteOpenHelper {
public static final int database_version = 3;
public String CREATE_QUERY = "CREATE TABLE 
"+TableData.TableInfo.TABLE_NAME+"("+TableData.TableInfo.USER_NAME+" 
TEXT,"+TableData.TableInfo.USER_PASSWORD+" TEXT );";

public DatabaseOperations(Context context) {
    super(context, TableData.TableInfo.DATABASE_NAME, null, 
database_version);
    Log.d("Database operations", "Database created");

    // constructor stub
}

@Override
public void onCreate(SQLiteDatabase sdb) {
    sdb.execSQL(CREATE_QUERY);
    Log.d("Database operations","Table created");



    // method stub
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {



    // method stub
}

public void putInformation(DatabaseOperations dop, String name, String pass) 
{
    SQLiteDatabase SQ = dop.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(TableData.TableInfo.USER_NAME, name);
    cv.put(TableData.TableInfo.USER_PASSWORD, pass);
    long k = SQ.insert(TableData.TableInfo.TABLE_NAME, null,cv);
    Log.d("Database operations", "One raw inserted");

    // inserts data into database


}

public Cursor getInformation(DatabaseOperations dop){
    SQLiteDatabase SQ = dop.getReadableDatabase();
    String[] columns = {TableData.TableInfo.USER_NAME, 
TableData.TableInfo.USER_PASSWORD};
    Cursor CR = SQ.query(TableData.TableInfo.TABLE_NAME ,columns, null, 
null, null, null, null);
    return CR;
}

}
import android.provider.BaseColumns;

public class TableData {
public TableData(){





}
public static abstract class TableInfo implements BaseColumns {
    public static final String USER_NAME = "user_name";
    public static final String USER_PASSWORD = "user_password";
    public static final String DATABASE_NAME = "user_info";
    public static final String TABLE_NAME = "reg_table";

}



}
Home.java

login.java

TableData.java

包m.rami.psu

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DatabaseOperations extends SQLiteOpenHelper {
public static final int database_version = 3;
public String CREATE_QUERY = "CREATE TABLE 
"+TableData.TableInfo.TABLE_NAME+"("+TableData.TableInfo.USER_NAME+" 
TEXT,"+TableData.TableInfo.USER_PASSWORD+" TEXT );";

public DatabaseOperations(Context context) {
    super(context, TableData.TableInfo.DATABASE_NAME, null, 
database_version);
    Log.d("Database operations", "Database created");

    // constructor stub
}

@Override
public void onCreate(SQLiteDatabase sdb) {
    sdb.execSQL(CREATE_QUERY);
    Log.d("Database operations","Table created");



    // method stub
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {



    // method stub
}

public void putInformation(DatabaseOperations dop, String name, String pass) 
{
    SQLiteDatabase SQ = dop.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(TableData.TableInfo.USER_NAME, name);
    cv.put(TableData.TableInfo.USER_PASSWORD, pass);
    long k = SQ.insert(TableData.TableInfo.TABLE_NAME, null,cv);
    Log.d("Database operations", "One raw inserted");

    // inserts data into database


}

public Cursor getInformation(DatabaseOperations dop){
    SQLiteDatabase SQ = dop.getReadableDatabase();
    String[] columns = {TableData.TableInfo.USER_NAME, 
TableData.TableInfo.USER_PASSWORD};
    Cursor CR = SQ.query(TableData.TableInfo.TABLE_NAME ,columns, null, 
null, null, null, null);
    return CR;
}

}
import android.provider.BaseColumns;

public class TableData {
public TableData(){





}
public static abstract class TableInfo implements BaseColumns {
    public static final String USER_NAME = "user_name";
    public static final String USER_PASSWORD = "user_password";
    public static final String DATABASE_NAME = "user_info";
    public static final String TABLE_NAME = "reg_table";

}



}
错误屏幕


反转do/while,因为即使条件一开始为false,它也会执行

                while(CR.moveToNext()) {
                    if(username.equals(CR.getString(0))
                        && (userpass.equals(CR.getString(1))))  {
                        loginstatus = true;
                        NAME = CR.getString(0);
                    }

                }
或者更好:由于moveToFirst返回一个布尔值,这意味着要获取数据,所以您只需对照它进行检查:

       if(CR.moveToFirst())
          while(CR.moveToNext()){
              //do thing with data

您的表创建代码有一些问题。 试试这组代码

db.execSQL("CREATE TABLE IF NOT EXISTS " + purpose_of_loan_tb + " (" + pk_id + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                + purpose_of_loan_id + " INTEGER , " + user_id + " INTEGER, " + purpose_of_loan_status + " INTEGER, " +
                purpose_of_loan_json + " TEXT);");
插入代码:

public long insertRows(SQLiteDatabase db, String tableName, ContentValues contentValues) {
        long n = db.insert(tableName, null, contentValues);

        Util.printMessage(TAG, "Row inserted in " + tableName + " : " + n);
        return n;
    }
通过根据列名和相应的值将值放入内容值键中来调用此方法

就你而言:

contentValues.put("TableData.TableInfo.USER_NAME","ABCD");
要检索所有数据,可以使用此方法:

public Cursor getValueByColumn(SQLiteDatabase db, String table_name,
                                   String select_clause_colunms, String where_clause_column) {
        Cursor cursor = db
                .query(table_name, null, null, null, null, null, null);

        // print("Count " + cursor.getCount());

        return cursor;
    }

这将返回光标,您可以在其中检查光标计数。

非常感谢您,这真的很有帮助!太好了,如果这对你有帮助,如果这篇文章对你有帮助,请把它标记为答案。谢谢你,马科斯!
public Cursor getValueByColumn(SQLiteDatabase db, String table_name,
                                   String select_clause_colunms, String where_clause_column) {
        Cursor cursor = db
                .query(table_name, null, null, null, null, null, null);

        // print("Count " + cursor.getCount());

        return cursor;
    }