从sqlite数据库中检索数据?

时间:2016-06-10 09:01:53

标签: java android sql sqlite

我正在尝试从sqlite数据库中检索数据,但是当我调用nameData()时,logcat显示异常: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 我不明白为什么,任何线索?

过程:

    public class SearchContactByName2 extends AppCompatActivity {
    String dbString="",dbString2="";
        SQLiteDatabase db;
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.searchcontactbynamelayout2_main);

            TextView textView=(TextView)findViewById(R.id.textViewShowName);
            TextView textView2=(TextView)findViewById(R.id.textView2ShowNumber);

            SearchContactByName objOfSearchContactByName=new SearchContactByName();

            ContactDatabase onbOfContactDatabase=new ContactDatabase(getBaseContext());

            Cursor allcontact2= onbOfContactDatabase.nameData(objOfSearchContactByName.getNameForSearchTypeString);


            allcontact2.moveToFirst();

            do{
                dbString+=allcontact2.getString(allcontact2.getColumnIndex("name"));
                dbString2+=allcontact2.getString(allcontact2.getColumnIndex("phone"));
                dbString+="\n";
                dbString2+="\n";
                textView.setText(dbString);
                textView2.setText(dbString2);
            }while(allcontact2.moveToNext());
            Toast.makeText(getBaseContext(), "data", Toast.LENGTH_LONG).show();

        }
    }

数据库部分:

public class ContactDatabase extends SQLiteOpenHelper {
    SQLiteDatabase db;
    public static final String DATABASE_NAME="totalContact.db";
    public static final  String TABLE_NAME="mecontact";
    public static final  String NAME="name";
    public static final  String PHONE="phone";

    public ContactDatabase(Context context) {
        super(context, DATABASE_NAME, null, 1);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL("create table mecontact" +
                    "(id integer primary key autoincrement, name text, phone text)");
        }catch(android.database.SQLException e){
                System.out.println("table create nhi ho rha");
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS mecontact");
        onCreate(db);
    }

    public void insertContact(String nam,String mob){

        db=this.getWritableDatabase();
        ContentValues contentValues=new ContentValues();

        contentValues.put(NAME,nam);
        contentValues.put(PHONE,mob);

        db.insert(TABLE_NAME, null, contentValues);
        db.close();
    }

    public Cursor showData(){

        db=this.getWritableDatabase();
        Cursor res =  db.rawQuery("SELECT  * FROM mecontact", null);
        return res;

    }

    public Cursor nameData(String dataName){

        db=this.getWritableDatabase();
        Cursor res =  db.rawQuery("SELECT * FROM mecontact WHERE name = '"+dataName+"'", null);
        return res;

    }
}

4 个答案:

答案 0 :(得分:0)

尝试以下代码

 if(allcontact2.moveToFirst()){

      do{
            dbString+=allcontact2.getString(allcontact2.getColumnIndex("name"));
            dbString2+=allcontact2.getString(allcontact2.getColumnIndex("phone"));
            dbString+="\n";
            dbString2+="\n";
            textView.setText(dbString);
            textView2.setText(dbString2);
        }while(allcontact2.moveToNext());}
        Toast.makeText(getBaseContext(), " no data", Toast.LENGTH_LONG).show();

实际上你的数据库没有数据

答案 1 :(得分:0)

Cursor allcontact2= onbOfContactDatabase.nameData(objOfSearchContactByName.getNameForSearchTypeString);

if(allcontact2.size() > 0){
while(allcontact2.moveToNext()){
   dbString+=allcontact2.getString(allcontact2.getColumnIndex("name"));
   dbString2+=allcontact2.getString(allcontact2.getColumnIndex("phone"));
   dbString+="\n";
   dbString2+="\n";
   textView.setText(dbString);
   textView2.setText(dbString2);
  }
  Toast.makeText(getBaseContext(), "data", Toast.LENGTH_LONG).show();
}

答案 2 :(得分:0)

同时将sush的答案更改为nameData方法,

public Cursor nameData(String dataName){
    db=this.getReadableDatabase();
    //String dataname might contain special characters like a quote
    //retreive the cursor this way
    Cursor res=db.query("mecontact",new String[]{columnsYouwantToSelect},"name =?",new String[]{dataName},null,null,null);
    //if you want to select all the columns in the table replace
    //the second parameter with null
    return res;
}

答案 3 :(得分:0)

不是真的回答你的问题,而是关于如何防止将来出现问题的更多建议。我建议你将你的oncreate代码更改为此,并在顶部声明你的ID值,就像你为其他人所做的那样。这将确保正确创建数据库,并且在将来如果发生更改,您可以轻松获取值而不会出现输入错误。像这样的代码比纯查询更安全。

db.execSQL("CREATE TABLE "
            + TABLE_NAME
            + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + NAME + " TEXT,"
            + PHONE + " TEXT);" );