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

标签 java android sqlite

enter image description here

我对 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()));
    }

关于java - 查询已存在的数据库返回空游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391084/

相关文章:

java - 为什么在 Java String 实现中有一个偏移量?

java - 滑动窗口 : Implementation and Performance (Java)

android - 为什么 Switch 在旧版 Android 上不显示?

java - Android HTTP post 请求点击按钮

SQLite IF 存在子句

java - 将 JDBCTemplate 与 Hibernate SessionFactory 一起使用?

java - 用java声音不玩?甚至16或8位?

java - LibGdx android 访问 .txt 文件并将其转换为字符串

SQLite Int64 vs Int32 问题和 SubSonic ActiveRecord

sqlite - SQLite:表约束和触发器