2016-06-10 197 views
0

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

过程:

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; 

    } 
} 
+0

先用这个链接https://stackoverflow.com/questions/24901617/insert-values-in-to-sqlite-database-java-lang-nullpointerexception/24901693#24901693比较你的代码,然后你会发现你错了的地方 – DJhon

+0

一旦看到这个,你会得到一个想法http://androidcoding.in/2016/03/22/android-sqlite-tutorial-on-inserting-deleting-values-into-database/ – Abhishek

回答

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(); 

其实你的数据库没有数据

+0

为什么光标不检索任何数据 –

+0

是你正在发生.. jst检查是数据名称是der还是不 – Sush

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

没有真正回答你的问题,但更多的咨询如何防止今后麻烦。我建议你改变你的oncreate代码,并像在其他人那样声明你的ID值在顶端。这将确保数据库被正确创建,并且将来如果发生更改,您可以轻松获取值而不会出现输入错误。这样的代码比纯查询更安全。

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