Java 查询已存在的数据库返回空游标

Java 查询已存在的数据库返回空游标,java,android,sqlite,Java,Android,Sqlite,我不太熟悉sql,但我只是想从已经创建的数据库文件中获取两个值。“Balance”和“VoucherBalance”。当我尝试查询数据库时,当我将第三个和第四个参数添加到查询方法时,我会返回一个空游标,或者如果我将第三个和第四个参数保留为null,我会返回一个计数1,它只是我试图获取的两列的名称 为什么在指定所需的值时无法获取这些值 import android.content.Context; import android.database.Cursor; import android.dat

我不太熟悉sql,但我只是想从已经创建的数据库文件中获取两个值。“Balance”和“VoucherBalance”。当我尝试查询数据库时,当我将第三个和第四个参数添加到查询方法时,我会返回一个空游标,或者如果我将第三个和第四个参数保留为null,我会返回一个计数1,它只是我试图获取的两列的名称

为什么在指定所需的值时无法获取这些值

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

import java.util.Arrays;

public class DataBaseReader extends SQLiteOpenHelper
{
    private static final String TAG = "DataBaseReader";
    private static String DB_PATH = "/data/data/PACKAGENAME/databases/DATABAENAME.db";
    private static String DB_NAME = "TABLENAME";
    private SQLiteDatabase database;
    public double balance;
    public int voucher;
    private final Context myContext;
    public String text = "";


    public DataBaseReader(Context context)
    {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }

    public void getWireAccountBalance()
    {
        String[] projection = {DatabaseContract.Database.COLUMN_BALANCE, DatabaseContract.Database.COLUMN_VOUCHER};
        String[] selectionArgs = {"Balance", "VoucherBalance"};
        String selection = DatabaseContract.Database.COLUMN_BALANCE + "=?" + " AND " + DatabaseContract.Database.COLUMN_VOUCHER + "=?";
        SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);

        Cursor cursor = db.query(DatabaseContract.Database.TABLE_NAME, projection, selection, selectionArgs, null, null, null);


        Log.d(TAG, "Cursor count is " + String.valueOf(cursor.getCount()));
        text = Arrays.toString(cursor.getColumnNames());
        Toast.makeText(myContext, text, Toast.LENGTH_LONG).show();

        if (cursor.moveToFirst())
        {
            while (!cursor.moveToNext())
            {
                balance = cursor.getFloat(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_BALANCE));
                voucher = cursor.getInt(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_VOUCHER));
            }
        } else
        {

            Log.d(TAG, "Cursor count is " + String.valueOf(cursor.getCount()));
        }
    }


    @Override
    public synchronized void close()
    {
        super.close();
        if (database != null)
        {
            close();
        }
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase)
    {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
    {

    }
}

使用
moveTofirst
移动到第一行,然后使用
moveToNext
,这将返回false(当只有一行时),跳过第一行

我建议使用:-

    while(cursor.moveToNext()) {
        balance = cursor.getFloat(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_BALANCE));
        voucher = cursor.getInt(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_VOUCHER));
    }
而不是:-

    if (cursor.moveToFirst())
    {
        while (!cursor.moveToNext())
        {
            balance = cursor.getFloat(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_BALANCE));
            voucher = cursor.getInt(cursor.getColumnIndex(DatabaseContract.Database.COLUMN_VOUCHER));
        }
    } else
    {

        Log.d(TAG, "Cursor count is " + String.valueOf(cursor.getCount()));
    }