我有问题,你可以在下面看到。请帮我。我是Android App的初学者。预先感谢您的帮助。我收到以下错误:
错误:android.database.CursorIndexOutOfBoundsException:索引0 请求,大小为0
我不知道如何解决它。
这是我的数据库助手类: -
public class DbObsluha extends SQLiteOpenHelper{
private static String DB_JMENO = "Databaze.db";
private static String DB_CESTA ="";
private static final int DB_VERZE = 2;
private SQLiteDatabase databaze;
private Context mContext = null;
public DbObsluha(Context context) {
super(context, DB_JMENO, null, DB_VERZE);
DB_CESTA = context.getApplicationInfo().dataDir + "/databases/";
File file = new File(DB_CESTA + "Databaze.db");
if(file.exists())
otevreniDatabaze();
this.mContext = context;
/*
this.DB_CESTA = this.mContext.getDatabasePath(DB_JMENO).getAbsolutePath();
Log.e("Path 1", DB_CESTA);
*/
}
public void otevreniDatabaze() {
String mojeCesta = DB_CESTA + DB_JMENO;
databaze = SQLiteDatabase.openDatabase(mojeCesta, null, SQLiteDatabase.OPEN_READWRITE);
}
public void kopirovanoDatabaze() throws IOException {
try {
InputStream mujVstup = mContext.getAssets().open(DB_JMENO);
String vystupniNazevSouboru = DB_CESTA + DB_JMENO;
OutputStream mujVystup = new FileOutputStream(vystupniNazevSouboru);
byte[] buffer = new byte[1024];
int velikost;
while((velikost = mujVstup.read(buffer)) > 0)
mujVystup.write(buffer, 0, velikost);
mujVystup.flush();
mujVystup.close();
mujVstup.close();
}catch (Exception e){
e.printStackTrace();
}
}
private boolean overeniDataze() {
SQLiteDatabase tempDB = null;
try {
String mojeCesta = DB_CESTA + DB_JMENO;
tempDB = SQLiteDatabase.openDatabase(mojeCesta, null, SQLiteDatabase.OPEN_READWRITE);
}catch (SQLiteException e) {
e.printStackTrace();
}
if(tempDB != null)
{
tempDB.close();
}
return tempDB != null ? true : false;
}
public void vytvoreniDatabaze() throws IOException {
boolean existenceDatabaze = overeniDataze();
if (existenceDatabaze) {
}else {
this.getReadableDatabase();
try {
kopirovanoDatabaze();
}catch (IOException e) {
e.printStackTrace();
}
}
}
/*
@Override
public synchronized void close() {
if(databaze != null)
databaze.close();
super.close();
}
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion)
try {
kopirovanoDatabaze();
} catch (IOException e) {
e.printStackTrace();
}
}
//zobrazenu for table
public List<Otazky> vsechnyOtazky(){
List<Otazky> seznamOtazek = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor c;
try {
c = db.rawQuery("SELECT * FROM Otazky ORDER BY Random()", null);
if(c == null) return null;
c.moveToFirst();
do {
int Id = c.getInt(c.getColumnIndex("ID"));
String Otazka = c.getString(c.getColumnIndex("Otazka"));
String OdpovedA = c.getString(c.getColumnIndex("OdpovedA"));
String OdpovedB = c.getString(c.getColumnIndex("OdpovedB"));
String OdpovedC = c.getString(c.getColumnIndex("OdpovedC"));
String OdpovedD = c.getString(c.getColumnIndex("OdpovedD"));
String Vysledek = c.getString(c.getColumnIndex("Vysledek"));
Otazky otazky = new Otazky(Id, Otazka, OdpovedA, OdpovedB, OdpovedC, OdpovedD, Vysledek);
seznamOtazek.add(otazky);
}
while (c.moveToNext());
c.close();
}catch (Exception e){
e.printStackTrace();
}
db.close();
return seznamOtazek;
}
//upraveni pro aktivitu Hra
public List<Otazky> vsechnyOtazkyUroven(String uroven){
List<Otazky> seznamOtazek = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor c;
int konec = 0;
if(uroven.equals(Urovne.UROVEN.LEHKÁ.toString()))
konec = 5;
else if(uroven.equals(Urovne.UROVEN.STŘEDNÍ.toString()))
konec = 10;
else if(uroven.equals(Urovne.UROVEN.TĚŽKÁ.toString()))
konec = 15;
else if(uroven.equals(Urovne.UROVEN.LEGENDÁRNÍ.toString()))
konec = 20;
try {
c = db.rawQuery(String.format("SELECT * FROM Otazky ORDER BY Random() LIMIT %d", konec), null);
if(c == null) return null;
c.moveToFirst();
do {
int Id = c.getInt(c.getColumnIndex("ID"));
String Otazka = c.getString(c.getColumnIndex("Otazka"));
String OdpovedA = c.getString(c.getColumnIndex("OdpovedA"));
String OdpovedB = c.getString(c.getColumnIndex("OdpovedB"));
String OdpovedC = c.getString(c.getColumnIndex("OdpovedC"));
String OdpovedD = c.getString(c.getColumnIndex("OdpovedD"));
String Vysledek = c.getString(c.getColumnIndex("Vysledek"));
Otazky otazky = new Otazky(Id, Otazka, OdpovedA, OdpovedB, OdpovedC, OdpovedD, Vysledek);
seznamOtazek.add(otazky);
}while (c.moveToNext());
c.close();
}catch (Exception e){
e.printStackTrace();
}
db.close();
return seznamOtazek;
}
//Vložení skore do žebříčku
public void vlozeniSkore(double skore){
/*SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("Skore", Skore);
db.insert("Zebricek", null, contentValues);
*/
String query = "INSERT INTO Zebricek(Skore) VALUES("+ skore +")";
databaze.execSQL(query);
}
//get score and sort ranking
public List<Zebricek> getZebricek(){
List<Zebricek> seznamZebricku = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor c;
try {
c = db.rawQuery("SELECT * FROM Zebricek ORDER BY Skore DESC", null);
if (c == null) return null;
c.moveToNext();
do {
int Id = c.getInt(c.getColumnIndex("ID"));
double Skore = c.getDouble(c.getColumnIndex("Skore"));
Zebricek zebricek = new Zebricek(Id, Skore);
seznamZebricku.add(zebricek);
}while (c.moveToNext());
c.close();
}catch (Exception e){
e.printStackTrace();
}
db.close();
return seznamZebricku;
}
}
这是活动类: -
public class Hra extends AppCompatActivity implements View.OnClickListener{
final static long INTERVAL = 1000; // 1 sekunda
final static long KONEC = 7000; // 7 sekund
int meziSkore = 0;
CountDownTimer countDownTimer; //odpočítavadlo pro meziSkore
List<Otazky> otazkyHra = new ArrayList<>(); // všechny otazky
DbObsluha db;
int index = 0, skore = 0, thisOtazka = 0, vsechnyOtazky, spravnaOdpoved;
String uroven="";
//Ovládání
ProgressBar progressBar;
Button btnA, btnB, btnC, btnD;
TextView txtSkore, txtOtazka, txtZadani;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hra);
//data z hlavní aktivity
Bundle extra = getIntent().getExtras();
if(extra != null)
uroven = extra.getString("UROVEN");
db = new DbObsluha(this);
txtSkore = (TextView)findViewById(R.id.txtSkore);
txtOtazka = (TextView)findViewById(R.id.txtOtazka);
txtZadani = (TextView)findViewById(R.id.txtZadani);
progressBar = (ProgressBar)findViewById(R.id.progessBar);
btnA = (Button)findViewById(R.id.btnOdpovedA);
btnB = (Button)findViewById(R.id.btnOdpovedB);
btnC = (Button)findViewById(R.id.btnOdpovedC);
btnD = (Button)findViewById(R.id.btnOdpovedD);
btnA.setOnClickListener(this);
btnB.setOnClickListener(this);
btnC.setOnClickListener(this);
btnD.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
otazkyHra = db.vsechnyOtazkyUroven(uroven);
vsechnyOtazky = otazkyHra.size();
countDownTimer = new CountDownTimer(KONEC, INTERVAL) {
@Override
public void onTick(long millisUntilFinished) {
progressBar.setProgress(meziSkore);
meziSkore++;
}
@Override
public void onFinish() {
countDownTimer.cancel();
ukazOtazku(++index);
}
};
ukazOtazku(index);
}
private void ukazOtazku(int index) {
if(index < vsechnyOtazky)
{
thisOtazka++;
txtOtazka.setText(String.format("%d/%d", thisOtazka, vsechnyOtazky));
progressBar.setProgress(0);
meziSkore = 0;
txtZadani.setText(otazkyHra.get(index).getOtazka());
btnA.setText(otazkyHra.get(index).getOdpovedA());
btnB.setText(otazkyHra.get(index).getOdpovedB());
btnC.setText(otazkyHra.get(index).getOdpovedC());
btnD.setText(otazkyHra.get(index).getOdpovedD());
countDownTimer.start();
}
else{
Intent intent = new Intent(this,Vysledek.class);
Bundle odeslaniDat = new Bundle();
odeslaniDat.putInt("SKORE",skore);
odeslaniDat.putInt("VSECHNYOTAZKY",vsechnyOtazky);
odeslaniDat.putInt("SPRAVNAODPOVED",spravnaOdpoved);
intent.putExtras(odeslaniDat);
startActivity(intent);
finish();
}
}
@Override
public void onClick(View v) {
countDownTimer.cancel();
if(index < vsechnyOtazky){
Button zmacknuteTlacitko = (Button)v;
if(zmacknuteTlacitko.getText().equals(otazkyHra.get(index).getVysledek()))
{
skore+=10; //zvětšení skore
spravnaOdpoved++; //zvětšená správné odpovědi
ukazOtazku(++index);
}
else {
ukazOtazku(++index); // pokud zvolí dobře, následuje další otázka
}
txtSkore.setText(String.format("%d", skore));
}
}
}
答案 0 :(得分:1)
您的光标为空。您无法从空光标读取任何数据,因此例外。
如果移动未成功,moveToFirst()
和moveToNext()
都将返回false
。你忽略了moveToFirst()
的结果,并尝试从光标读取导致异常。
答案 1 :(得分:0)