游标索引越界异常,Android数据库

时间:2013-09-29 00:30:51

标签: android database gyroscope

我正在做一个Android应用程序。我试图让数据库的行在文本视图中查看它们。在开始我想采取数据库的第一行。然后我使用陀螺仪在屏幕上滑动引号。但是我得到了这个错误。有人可以帮我吗?非常感谢。

这是SlideShow类

package com.example.prova1;

import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;



public class SlideQuote extends Activity implements SensorEventListener
{
 //a TextView
 private TextView quote;
 private TextView author;
 //the Sensor Manager
 private SensorManager sManager;
 float x;
 int id;
 int total;
 String s1,s2;
  Database quotedatabase = new Database(this);


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.slide_quote);

        //get the TextView from the layout file
        quote = (TextView) findViewById(R.id.textView3);
        author = (TextView) findViewById(R.id.textView4);
id=1;
        //get a hook to the sensor service

        sManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
     if(sManager.getSensorList(Sensor.TYPE_GYROSCOPE).size()!=0){
      Sensor s =sManager.getSensorList(Sensor.TYPE_GYROSCOPE).get(o);
      sManager.registerListener(this,s ,SensorManager.SENSOR_DELAY_NORMAL);
      quotedatabase.getQuote(id, s1, s2);
      quote.setText(s1);
      author.setText(s2);
    }
    }
    //when this Activity starts
    @Override
 protected void onResume()
 {
  super.onResume();
  /*register the sensor listener to listen to the gyroscope sensor, use the
  callbacks defined in this class, and gather the sensor information as quick
  as possible*/
  sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),SensorManager.SENSOR_DELAY_FASTEST);
 }

  //When this Activity isn't visible anymore
 @Override
 protected void onStop()
 {
  //unregister the sensor listener
  sManager.unregisterListener(this);
  super.onStop();
 }

 @Override
 public void onAccuracyChanged(Sensor arg0, int arg1)
 {
  //Do nothing.
 }

 @Override
 public void onSensorChanged(SensorEvent event)
 {
  //if sensor is unreliable, return void
  if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
  {
   return;
  }
  //else it will output the Roll, Pitch and Yawn values
  x=event.values[2];
  total=quotedatabase.getQuotesCount();

  if(x>25){
   if(id==total)
   {id=1;
   }
   else{

   id++;
   }
      quotedatabase.getQuote(id, s1, s2);
      quote.setText(s1);
      author.setText(s2);

  }
  if(x<-25){
   if(id==1)
   {id=total;}
   else{
   id--;}

      quotedatabase.getQuote(id, s1, s2);
      quote.setText(s1);
      author.setText(s2);
  }
  }
 @Override
 public void onBackPressed() {
  // TODO Auto-generated method stub
  sManager.unregisterListener(this);
  Intent backIntent = new Intent(getApplication(), Quote.class);
       finish();
       startActivity(backIntent);

 }


 }

这是数据库:

package com.example.prova1;

/**This class is for the database that is used to store quotes*/

import java.util.ArrayList;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

 public Database(Context quoteContext){

 super(quoteContext, "quoteDB", null, 1);

 }

 @Override
 //Create database
 public void onCreate(SQLiteDatabase database) {

  String query = "CREATE TABLE quotelist ( quoteId INTEGER PRIMARY KEY, textQuote TEXT ,textAuthor TEXT)";
  String query1 = "INSERT INTO quotelist  VALUES ( '1', 'RAI', 'uku')";


    database.execSQL(query);
    database.execSQL(query1);
 }

 @Override
 public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {

   String query = "DROP TABLE IF EXISTS quotelist";

   database.execSQL(query);
   onCreate(database);
  }

 //Insert quotes into database 
public void insertItem(HashMap<String, String> queryValues){

  SQLiteDatabase database = this.getWritableDatabase();

  ContentValues values = new ContentValues();

  values.put("textQuote", queryValues.get("textQuote"));
  values.put("textAuthor", queryValues.get("textAuthor"));

  database.insert("quotelist", null, values);

  database.close();

 }

//Update the quotes into the database

public int updateItem(HashMap<String, String> queryValues) {

 SQLiteDatabase database = this.getWritableDatabase();

 ContentValues values = new ContentValues();

 values.put("textQuote", queryValues.get("textQuote"));
 values.put("textAuthor", queryValues.get("textAuthor"));

 return database.update("quotelist", values, "quoteId" + " = ?", new String[] {queryValues.get("quoteId") });

}

//Delete quotes into the database

public void deleteItem(String id){

 SQLiteDatabase database = this.getWritableDatabase();

 String deleteQuery = "DELETE FROM quotelist WHERE quoteId='" + id + "'";

 database.execSQL(deleteQuery);
 database.close();


}

public ArrayList<HashMap<String, String>> getAllItems(){

 ArrayList<HashMap<String, String>> itemArrayList = new ArrayList<HashMap<String, String>>();

 String selectQuery = "SELECT * FROM quotelist";

 SQLiteDatabase database = this.getWritableDatabase();

 Cursor cursor = database.rawQuery(selectQuery, null);

 if(cursor.moveToFirst()){

  do{

   HashMap<String, String> itemMap = new HashMap<String, String>();

   itemMap.put("quoteId", cursor.getString(o));
   itemMap.put("textQuote", cursor.getString(1));
   itemMap.put("textAuthor", cursor.getString(2));


  itemArrayList.add(itemMap);

  } while(cursor.moveToNext());

 }
 database.close();

 return itemArrayList;

}

public HashMap<String, String> getItemInfo(String id){

 HashMap<String, String> itemMap = new HashMap<String, String>();

 SQLiteDatabase database = this.getReadableDatabase();

 String selectQuery = "SELECT * FROM quotelist WHERE quoteId='" + id + "'";

 Cursor cursor = database.rawQuery(selectQuery, null);

 if(cursor.moveToFirst()){

  do{

   itemMap.put("quoteId", cursor.getString(o));
   itemMap.put("textQuote", cursor.getString(1));
   itemMap.put("textAuthor", cursor.getString(2));

  } while(cursor.moveToNext());

 }

 return itemMap;

}

public void getQuote(int id, String s1,String s2) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query("quotelist", new String[] { "quoteId",
            "textQuote", "textAuthor" }, "quoteId" + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();
s1=cursor.getString(1);
s2=cursor.getString(2);


}
public int getQuotesCount() {
    String countQuery = "SELECT  * FROM  quotelist" ;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();

    // return count
    return cursor.getCount();
}

错误是这行:s1 = cursor.getString(1);在DatabaseClass

和at:quotedatabase.getQuote(id,s1,s2);在ShowQuote类

2 个答案:

答案 0 :(得分:1)

此错误表示光标中没有数据。您的数据库中是否包含数据?此外,您应该检查moveToFirst的结果,因为如果光标为空,则会显示false值。

答案 1 :(得分:0)

错误在于:s1 = cursor.getString(1);和 S2 = cursor.getString(2); 如果字符串长度为0,则无法获得第二个字符,并且您将获得outofboundexception。

此操作也无效。在这种情况下,您为您的方法提供一个字符串。方法中的S1与您给方法的字符串不同。通过为方法赋予变量,JAVA会创建此变量的副本。