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