Android 在spinner中从sqlite数据库获取数据时发生异常

Android 在spinner中从sqlite数据库获取数据时发生异常,android,sqlite,Android,Sqlite,在尝试从sqlite数据库获取spinner中的数据时,我得到了java.lang.IllegalStateException。数据在数据库中输入正确,当我试图检索时,一切正常。然而,当我试图在微调器中加载数据时,问题就出现了。 我的代码打算做的是首先将从web服务获得的数据保存在sqlite数据库中,并加载用户选择的国家的状态。 如果你有更好的方法,请建议我的链接。下面是日志 10-06 01:08:38.125: E/CursorWindow(1067): Failed to read ro

在尝试从sqlite数据库获取spinner中的数据时,我得到了java.lang.IllegalStateException。数据在数据库中输入正确,当我试图检索时,一切正常。然而,当我试图在微调器中加载数据时,问题就出现了。 我的代码打算做的是首先将从web服务获得的数据保存在sqlite数据库中,并加载用户选择的国家的状态。 如果你有更好的方法,请建议我的链接。下面是日志

10-06 01:08:38.125: E/CursorWindow(1067): Failed to read row 0, column 1 from a CursorWindow  which has 1356 rows, 1 columns.
10-06 01:08:38.125: D/AndroidRuntime(1067): Shutting down VM
10-06 01:08:38.135: W/dalvikvm(1067): threadid=1: thread exiting with uncaught exception (group=0xb2a3bba8)
10-06 01:08:38.165: E/AndroidRuntime(1067): FATAL EXCEPTION: main
10-06 01:08:38.165: E/AndroidRuntime(1067): Process: com.manish.tabdemo, PID: 1067
10-06 01:08:38.165: E/AndroidRuntime(1067): java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.manish.tabdemo/com.manish.tabdemo.countrystatelist}:  java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor  is initialized correctly before accessing data from it.
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.os.Looper.loop(Looper.java:136)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread.main(ActivityThread.java:5017)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at java.lang.reflect.Method.invokeNative(Native Method)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at java.lang.reflect.Method.invoke(Method.java:515)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at dalvik.system.NativeStart.main(Native Method)
10-06 01:08:38.165: E/AndroidRuntime(1067): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.database.CursorWindow.nativeGetString(Native Method)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.database.CursorWindow.getString(CursorWindow.java:434)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at com.manish.tabdemo.DatabaseHandler.getAllCountries(DatabaseHandler.java:85)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at com.manish.tabdemo.countrystatelist.loadCountrySpinnerData(countrystatelist.java:80)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at com.manish.tabdemo.countrystatelist.onCreate(countrystatelist.java:48)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.Activity.performCreate(Activity.java:5231)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-06 01:08:38.165: E/AndroidRuntime(1067):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
10-06 01:08:38.165: E/AndroidRuntime(1067):     ... 11 more
10-06 01:09:21.635: I/Process(1067): Sending signal. PID: 1067 SIG: 9
下面是代码

countrystatelist.java

public class countrystatelist extends Activity implements OnItemSelectedListener{


private static final String NAMESPACE = "riderapp";
private static final String METHOD_NAME = "getCountryandStateList";
private static final String URL = "http://demo.php.otssolutions.com/ridersapp/admin/server.php?wsdl";
private static final String SOAP_ACTION = "riderappAppServer";
String Status;
String array;
String temp;
TextView textView;
String truee = "true";
DatabaseHandler db;
Spinner country_spinner;
Spinner state_spinner;
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    setContentView(R.layout.countrystatelist);
    textView = (TextView) findViewById(R.id.result);
    country_spinner = (Spinner) findViewById(R.id.country);
    state_spinner = (Spinner) findViewById(R.id.state);
    country_spinner.setOnItemSelectedListener(this);
    loadCountrySpinnerData();
     AsyncCallWS task = new AsyncCallWS();
        task.execute();
        db = new DatabaseHandler(this);
}

public void callservice(){
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty(truee, "true");
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    try{
        androidHttpTransport.call(SOAP_ACTION, envelope);

    SoapObject result = (SoapObject)envelope.bodyIn;
    Status = result.getProperty(0).toString();


    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void loadCountrySpinnerData() {
    // database handler
    DatabaseHandler db = new DatabaseHandler(getApplicationContext());

    // Spinner Drop down elements
    List<countrystate> lables = db.getAllCountries();

    // Creating adapter for spinner
    ArrayAdapter<countrystate> dataAdapter = new ArrayAdapter<countrystate>(this,
            android.R.layout.simple_spinner_item, lables);

    // Drop down layout style - list view with radio button
    dataAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    country_spinner.setAdapter(dataAdapter);
}

private void loadStateSpinnerData(String label) {
    // database handler
    DatabaseHandler db = new DatabaseHandler(getApplicationContext());

    // Spinner Drop down elements
    List<countrystate> lables = db.getAllStates(label);

    // Creating adapter for spinner
    ArrayAdapter<countrystate> dataAdapter = new ArrayAdapter<countrystate>(this,
            android.R.layout.simple_spinner_item, lables);

    // Drop down layout style - list view with radio button
    dataAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    state_spinner.setAdapter(dataAdapter);
}

private class AsyncCallWS extends AsyncTask<String, Void, Void> {
    @Override
    protected Void doInBackground(String... params) {
        Log.i("OTS+++++++++++++++++++++++++++++++++++++++", "doInBackground");
        callservice();
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        Log.i("OTS---------------------------------------", "onPostExecute");
    //textView.setText(Status);

        String s[] = new String[350];
        String country_id[] = new String[350];
        String country_name[] = new String[350];
        String state_id[] = new String[700];
        String state_name[] = new String[700];
        StringTokenizer tokens = new StringTokenizer(Status, ",");
        for(int i=0;i<339;i++){
            s[i] = tokens.nextToken();
            }
        for(int i=0;i<339;i++){

            country_id[i] = s[i].substring(s[i].indexOf("id=")+3, s[i].indexOf(";", s[i].indexOf("id=")));
            country_name[i] = s[i].substring(s[i].indexOf("country_name=")+13, s[i].indexOf(";", s[i].indexOf("country_name=")));
             state_id[i] = s[i].substring(s[i].indexOf("sid=")+4, s[i].indexOf(";", s[i].indexOf("sid=")));
             state_name[i] = s[i].substring(s[i].indexOf("state_name=")+11, s[i].indexOf(";", s[i].indexOf("state_name")));
             db.addEntry(new countrystate(country_id[i], country_name[i], state_id[i], state_name[i]));
        }

        List<countrystate> list = db.getAllCountries();
        for( countrystate t : list){
            Log.e("OTS", t.get_id()+t.get_countryname()+t.get_stateid()+t.get_statename());
        }
    }
    @Override
    protected void onPreExecute() {
        Log.i("OTS===========================================", "onPreExecute");
        textView.setText("Validating..Please Wait");
    }
    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i("OTS*******************************************", "onProgressUpdate");
    }


}

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {

    String label = arg0.getItemAtPosition(arg2).toString();

    loadStateSpinnerData(label);
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {


}
}
public class countrystate{


String id;
String country_name;
String state_id;
String state_name;

public countrystate(){

}

public countrystate(String id,String country_name,String state_id,String state_name){
    this.id = id;
    this.country_name = country_name;
    this.state_id = state_id;
    this.state_name = state_name;
}

public String get_id(){
    return this.id;
}

public String get_countryname(){
    return this.country_name;
}

public String get_stateid(){
    return this.state_id;
}

public String get_statename(){
    return this.state_name;
}

public void set_id(String id){
    this.id = id;
}

public void set_countryname(String country_name){
    this.country_name = country_name;
}

public void set_stateid(String state_id){
    this.state_id = state_id;
}

public void set_statename(String state_name){
    this.state_name = state_name;
}

}

在您的
getAllCountries()
中,您的
SELECT
只有一列,但您正试图使用
getString(0)
getString(3)
访问4列数据。确保您的
SELECT
至少选择相同数量的列

10-06 01:08:38.125:E/CursorWindow(1067):无法读取第0行第1列 从一个包含1356行1列的游标窗口中选择1

10-06 01:08:38.165:E/AndroidRuntime(1067):由以下原因引起: java.lang.IllegalStateException:无法从中读取第0行第1列 游标窗口。在开始之前,请确保光标已正确初始化 从中访问数据

从这个异常中,您可以理解这个异常背后的原因。此异常表示您正在尝试读取不存在的列1,因为只创建了一个列

建议:

ArrayList<Country> listCountry = new ArrayList<>();
Country objCountry = new Country();
objCountry.setCountryID(1);
objCountry.setCountryName("India");
listCountry.add(objCountry);
  • 不要直接使用列号,最佳做法是使用方法

  • 不要使用单独的数组,最佳做法是使用ArrayList,其中对象可以是任何用户定义的对象,如学生、学院、国家等

  • 坏习惯:

    ArrayList<Country> listCountry = new ArrayList<>();
    Country objCountry = new Country();
    objCountry.setCountryID(1);
    objCountry.setCountryName("India");
    listCountry.add(objCountry);
    
    字符串s[]=新字符串[350]; 字符串country_id[]=新字符串[350]; 字符串country_name[]=新字符串[350]; 字符串状态_id[]=新字符串[700]; 字符串状态_name[]=新字符串[700]

    最佳实践:

    ArrayList<Country> listCountry = new ArrayList<>();
    Country objCountry = new Country();
    objCountry.setCountryID(1);
    objCountry.setCountryName("India");
    listCountry.add(objCountry);
    
    ArrayList listCountry=new ArrayList();
    国家/地区对象国家/地区=新国家/地区();
    objCountry.setCountryID(1);
    objCountry.setCountryName(“印度”);
    添加(对象国家);
    
    非常感谢您让我了解我的问题。那我该怎么做呢?我只想删除
    getString(1)
    getString(3)
    或在
    SELECT
    @laalto中至少再添加三列,如果(cursor.moveToFirst()){do{countrystate cs=new countrystate();cs.set_countryname(cursor.getString(1));list.add(cs)将代码更改为此}虽然(cursor.moveToNext());}但仍然得到相同的错误是,因为列索引从0开始,而不是从1开始。@user3828709实现上述最佳实践,然后在此处以任何状态更新。@Paresh Mayani我将代码更改为cs.set_countryname(cursor.getColumnIndex(country_name));但是它给出了一个错误,类型countrystate中的方法set_countryname(String)不适用于参数(int)@user3828709您需要一本Android应用程序开发的好书!很抱歉